// 


// **********************************************************************************************
// **********************************************************************************************
// *********************************************************************************************
// ***********************************************************************************************
// Foi evitado a gravacao de caracteres acentuados neste arquivo para que o usuario nao tenha
// a pereocupacao com a selecao do formato (UTF-8  ou 8859-1, etc). Naturalmente, formatos como
// UTF-16 distorcem totalmente o texto, ficando mais facil perceber e corrigir. 
// Os caracteres acentuados tambem foram evitados na biblioteca para evitar que saim distorcidos. 
// **********************************************************************************************
// **********************************************************************************************
// **********************************************************************************************
// **********************************************************************************************



#include <cstdlib>
#include <cstring>
#include <ctime>
#include <string>
#include <iomanip>
#include <sstream>
#include <iostream>
#include <fstream>

#ifndef WIN32
#include <unistd.h>
#define sleep2(A) usleep((A)*1000)
#define DLL_IMPORT
#define BARRA "/" 
#else
#include <windows.h>
#include <process.h>
#define DLL_IMPORT __declspec(dllimport) __stdcall
#define sleep2(A) Sleep((A))
#define BARRA "\\" 
#endif



using namespace std;

// ------------------------------------------------ INICIALIZACAO DA BIBLIOTECA




extern "C" int DLL_IMPORT  ECF_AbrePortaSerial(void);
extern "C" int DLL_IMPORT  ECF_AbreConnectC(int, char *);
extern "C" int DLL_IMPORT  ECF_FechaPortaSerial(void);
extern "C" int DLL_IMPORT  ECF_RetornaPortaVelocidade(char *, char *);
extern "C" int DLL_IMPORT  ECF_LigaDesligaJanelas(char *, char *);
extern "C" int DLL_IMPORT  ECF_ZAUTO(char *);
extern "C" int DLL_IMPORT  ECF_CfgRedZAutomatico(char *);
extern "C" int DLL_IMPORT  ECF_Registry(void);
extern "C" int DLL_IMPORT  ECF_Registry_AlteraRegistry(char *, char *);
extern "C" int DLL_IMPORT  ECF_Registry_Path(char *);
extern "C" int DLL_IMPORT  ECF_Registry_PathMFD(char *);
extern "C" int DLL_IMPORT  ECF_Registry_Zautomatica(char *);
extern "C" int DLL_IMPORT  ECF_Registry_Verao(char *);
extern "C" int DLL_IMPORT  ECF_Registry_Log(char *);
extern "C" int DLL_IMPORT  ECF_Registry_AplMensagem1(char *);
extern "C" int DLL_IMPORT  ECF_Registry_AplMensagem2(char *);
extern "C" int DLL_IMPORT  ECF_Registry_Default(void);
extern "C" int DLL_IMPORT  ECF_Registry_RetornaValor(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_RetornaPath(char *);
extern "C" int DLL_IMPORT  ECF_RetornaPathMFD(char *);

// --------------------------------------------------- PROGRAMACAO
extern "C" int DLL_IMPORT  ECF_EnviarLogotipoCliche(char *);
extern "C" int DLL_IMPORT  ECF_GravarLogotipoCliche(void);
extern "C" int DLL_IMPORT  ECF_ExcluirLogotipoCliche(void);
extern "C" int DLL_IMPORT  ECF_ApagaTabelaAliquotas(void);
extern "C" int DLL_IMPORT  ECF_ApagaTabelaNomesNaoFiscais(void);
extern "C" int DLL_IMPORT  ECF_ApagaTabelaNomesRelatoriosGerenciais(void);
extern "C" int DLL_IMPORT  ECF_ApagaTabelaNomesFormasdePagamento(void);
extern "C" int DLL_IMPORT  ECF_ProgramarParametrosDiversos(char *, char *, char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_ProgramarCliche(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_ProgramarTotalizadoresNaoTributados(char *, char *, char *, char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_ProgramaAliquota(char *, unsigned int);
extern "C" int DLL_IMPORT  ECF_ProgramarRelogio(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_ProgramaHorarioVerao(void);
extern "C" int DLL_IMPORT  ECF_NomeiaTotalizadorNaoSujeitoIcms(int indice, char *cTot);
extern "C" int DLL_IMPORT  ECF_ProgramaFormaPagamentoMFD(char *cFormaPgto, char *cTef);
extern "C" int DLL_IMPORT  ECF_ProgramaFormasPagamento(char *);
extern "C" int DLL_IMPORT  ECF_NomeiaRelatorioGerencialMFD(char *, char *);
extern "C" int DLL_IMPORT  ECF_ProgramaOperador(char *);
extern "C" int DLL_IMPORT  ECF_CfgFechaAutomaticoCupom(char *);
extern "C" int DLL_IMPORT  ECF_CfgHorarioVerao(char *);
extern "C" int DLL_IMPORT  ECF_CfgCupomAdicional(char *);
extern "C" int DLL_IMPORT  ECF_ImprimeConfiguracoesImpressora(void);
extern "C" int DLL_IMPORT  ECF_ConfigurarECF(char *, char *, char *, char *); 

// ------------------------------------------------ ABERTURA DO DIA
extern "C" int DLL_IMPORT  ECF_AberturaDoDia(char *, char *);

// ------------------------------------------------- CUPOM FISCAL 
extern "C" int DLL_IMPORT  ECF_AbreCupom(char *);
extern "C" int DLL_IMPORT  ECF_AbreCupomMFD(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_IdentificaConsumidor(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_AumentaDescricaoItem(char *);
extern "C" int DLL_IMPORT  ECF_UsaUnidadeMedida(char *);
extern "C" int DLL_IMPORT  ECF_VendeItem(char *,char *, char *, char *, char *, int, char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_VendeItemTresDecimais(char*,char*,char*,char*,char*,char*,char*);
extern "C" int DLL_IMPORT ECF_VendeItemDepartamento(char*,char*,char*,char*,char*,char*,char*,char*,char*);
extern "C" int DLL_IMPORT  ECF_DescontoSobreItemVendido(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_AcrescimoDescontoItemMFD(char *,char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_CancelaItemAnterior(void);
extern "C" int DLL_IMPORT  ECF_CancelaItemGenerico(char *);
extern "C" int DLL_IMPORT  ECF_CancelaAcrescimoDescontoItemMFD(char *, char *);
extern "C" int DLL_IMPORT  ECF_IniciaFechamentoCupom(char *,char *,char *);
extern "C" int DLL_IMPORT  ECF_IniciaFechamentoCupomMFD(char *,char *,char *,char *);
extern "C" int DLL_IMPORT  ECF_SubTotalizaCupomMFD(void);
extern "C" int DLL_IMPORT  ECF_AcrescimoDescontoSubtotalMFD(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_CancelaAcrescimoDescontoSubtotalMFD(char *);
extern "C" int DLL_IMPORT  ECF_TotalizaCupomMFD(void);
extern "C" int DLL_IMPORT  ECF_EfetuaFormaPagamento(char *, char *);
extern "C" int DLL_IMPORT  ECF_EfetuaFormaPagamentoDescricaoForma(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_EfetuaFormaPagamentoMFD(char *, char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_TerminaFechamentoCupom(char *);
extern "C" int DLL_IMPORT  ECF_FechaCupom(char *,char *, char *, char *,char *,char *);
extern "C" int DLL_IMPORT  ECF_FechaCupomResumido(char *, char *);
extern "C" int DLL_IMPORT  ECF_AtivaDesativaCorteProximoMFD(unsigned int);
extern "C" int DLL_IMPORT  ECF_CupomAdicionalMFD(void);
extern "C" int DLL_IMPORT  ECF_ProgramaArredondamento(void);
extern "C" int DLL_IMPORT  ECF_ProgramaTruncamento(void);

// ------------------------------------------------- CANCELAMENTO DE CUPOM E COMPROVANTE
extern "C" int DLL_IMPORT  ECF_CancelaCupom(void);
extern "C" int DLL_IMPORT  ECF_CancelaCupomMFD(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_CancelaRecebimentoNaoFiscalMFD(char *, char *, char *);

// ------------------------------------------------- COMPROVANTE
extern "C" int DLL_IMPORT  ECF_EstornoFormasPagamento(char *, char *, char *);

// ------------------------------------------------- COMPROVANTE CDC - TEF
extern "C" int DLL_IMPORT  ECF_IniciaModoTEF(void);
extern "C" int DLL_IMPORT  ECF_AbreComprovanteNaoFiscalVinculado(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_AbreComprovanteNaoFiscalVinculadoMFD(char *, char *,char *, char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_UsaComprovanteNaoFiscalVinculado(char *);
extern "C" int DLL_IMPORT  ECF_UsaComprovanteNaoFiscalVinculadoTEF(char *);
extern "C" int DLL_IMPORT  ECF_FechaComprovanteNaoFiscalVinculado(void);
extern "C" int DLL_IMPORT  ECF_FinalizaModoTEF(void);
extern "C" int DLL_IMPORT  ECF_TEF_TravarTeclado(void);
extern "C" int DLL_IMPORT  ECF_SegundaViaNaoFiscalVinculadoMFD(void);
extern "C" int DLL_IMPORT  ECF_SegundaViaCNFV(void);
extern "C" int DLL_IMPORT  ECF_ReimpressaoNaoFiscalVinculadoMFD(void);
extern "C" int DLL_IMPORT  ECF_EstornoNaoFiscalVinculadoMFD(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_CancelamentoCNFV(char *ignorado);
extern "C" int DLL_IMPORT  ECF_TEF_ImprimirRespostaCartao(char *, char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_TEF_ImprimirResposta(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_TEF_FechaRelatorio(void);
extern "C" int DLL_IMPORT  ECF_TEF_EsperarArquivo(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_RelatorioGerencialTEF(char *);
extern "C" int DLL_IMPORT  ECF_UsaRelatorioGerencialMFDTEF(char *);

// ------------------------------------------------- RECEBIMENTOS
extern "C" int DLL_IMPORT  ECF_Suprimento(char *, char *);
extern "C" int DLL_IMPORT  ECF_Sangria(char *);
extern "C" int DLL_IMPORT  ECF_FundoCaixa(char *, char *);
extern "C" int DLL_IMPORT  ECF_AbreRecebimentoNaoFiscalMFD(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_AbreRecebimentoNaoFiscal(char *, char *, char *, char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_RecebimentoNaoFiscal(char *cIndiceTot,char *cValor ,char *cFormaPgto);
extern "C" int DLL_IMPORT  ECF_EfetuaRecebimentoNaoFiscalMFD(char *, char *);
extern "C" int DLL_IMPORT  ECF_CancelaItemNaoFiscalMFD(char *);
extern "C" int DLL_IMPORT  ECF_AcrescimoItemNaoFiscalMFD(char *, char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_AcrescimoDescontoSubtotalRecebimentoMFD(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_TotalizaRecebimentoMFD(void);
extern "C" int DLL_IMPORT  ECF_IniciaFechamentoRecebimentoNaoFiscalMFD(char *, char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_FechaRecebimentoNaoFiscalMFD(char *);
extern "C" int DLL_IMPORT  ECF_EfetuaFormaPagamentoNaoFiscal(char *, char *,char *);

// ------------------------------------------------- RELATORIO GERENCIAL
extern "C" int DLL_IMPORT  ECF_AbreRelatorioGerencial(void);
extern "C" int DLL_IMPORT  ECF_AbreRelatorioGerencialMFD(char *);
extern "C" int DLL_IMPORT  ECF_EnviarTextoCNF(char *);
extern "C" int DLL_IMPORT  ECF_RelatorioGerencial(char *);
extern "C" int DLL_IMPORT  ECF_UsaRelatorioGerencialMFD(char *);
extern "C" int DLL_IMPORT  ECF_FechaRelatorioGerencial(void);
extern "C" int DLL_IMPORT  ECF_FechaRelatorioXouZ(void);

// ------------------------------------------------- LEITURAS FISCAIS
extern "C" int DLL_IMPORT  ECF_LeituraX(void);
extern "C" int DLL_IMPORT  ECF_LeituraMemoriaFiscalData(char *,char *);
extern "C" int DLL_IMPORT  ECF_LeituraMemoriaFiscalDataMFD(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_LeituraMemoriaFiscalReducao(char *,char *);
extern "C" int DLL_IMPORT  ECF_LeituraMemoriaFiscalReducaoMFD(char *, char *, char *);


// ------------------------------------------------- ENCERRAMENTO DO DIA
extern "C" int DLL_IMPORT  ECF_FechamentoDoDia(void);
extern "C" int DLL_IMPORT  ECF_ReducaoZ(char *cDatai, char *cHorai);
extern "C" int DLL_IMPORT  ECF_ReducaoZAjustaDataHora(char *, char *);

// --------------------------------------------------- VALIDACAO
extern "C" int DLL_IMPORT  ECF_Autenticacao(void);
extern "C" int DLL_IMPORT  ECF_AutenticacaoMFD(char *, char *);
extern "C" int DLL_IMPORT  ECF_AutenticacaoStr(char *);
extern "C" int DLL_IMPORT  ECF_VerificaDocAutenticacao(void);
extern "C" int DLL_IMPORT  ECF_ProgramaCaracterAutenticacao(char *);

// --------------------------------------------------- GAVETA
extern "C" int DLL_IMPORT  ECF_AcionaGaveta(void);
extern "C" int DLL_IMPORT  ECF_VerificaEstadoGaveta(unsigned int *);
extern "C" int DLL_IMPORT  ECF_VerificaEstadoGavetaStr(char *);

// --------------------------------------------------- CHEQUE
extern "C" int DLL_IMPORT  ECF_ProgramaMoedaSingular(char *);
extern "C" int DLL_IMPORT  ECF_ProgramaMoedaPlural(char *);
extern "C" int DLL_IMPORT  ECF_ProgramarLeiauteCheque(char *, char *);
extern "C" int DLL_IMPORT  ECF_IncluiCidadeFavorecido(char *, char *);
extern "C" int DLL_IMPORT  ECF_VerificaStatusCheque(unsigned int *);
extern "C" int DLL_IMPORT  ECF_VerificaStatusChequeStr(char *);
extern "C" int DLL_IMPORT  ECF_ImprimeCheque(char *,char *,char *,char *,char *,char *,char *);
extern "C" int DLL_IMPORT  ECF_ImprimeChequeMFD(char *,char *,char *,char *,char *,char *,char *,char *);
extern "C" int DLL_IMPORT  ECF_ImprimeCopiaCheque(void);
extern "C" int DLL_IMPORT  ECF_CancelaImpressaoCheque(void);
extern "C" int DLL_IMPORT  ECF_LeituraChequeMFD(char *sCMC7);
extern "C" int DLL_IMPORT  ECF_ImprimirCheque(char *,char *,char *,char *,char *,char *);
extern "C" int DLL_IMPORT  ECF_LiberarCheque(void);
extern "C" int DLL_IMPORT  ECF_LeituraCodigoMICR(char *);
extern "C" int DLL_IMPORT  ECF_CancelarCheque(void);
extern "C" int DLL_IMPORT  ECF_LeituraLeiautesCheques(void);

// -------------------------------------------------- STATUS DE PROGRAMACAO
extern "C" int DLL_IMPORT  ECF_RetornaTipoEcf(char *);
extern "C" int DLL_IMPORT  ECF_VersaoDll(char *);
extern "C" int DLL_IMPORT  ECF_VersaoFirmware(char *);
extern "C" int DLL_IMPORT  ECF_NumeroSerie(char *);
extern "C" int DLL_IMPORT  ECF_NumeroSerieMFD(char *);
extern "C" int DLL_IMPORT  ECF_NumeroSerieMemoriaMFD(char *);
extern "C" int DLL_IMPORT  ECF_MarcaModeloTipoImpressoraMFD(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_CGC_IE(char *, char *);
extern "C" int DLL_IMPORT  ECF_CNPJMFD(char *);
extern "C" int DLL_IMPORT  ECF_InscricaoEstadualMFD(char *);
extern "C" int DLL_IMPORT  ECF_InscricaoMunicipalMFD(char *);
extern "C" int DLL_IMPORT  ECF_NumeroSubstituicoesProprietario(char *);
extern "C" int DLL_IMPORT  ECF_SimboloMoeda(char *);
extern "C" int DLL_IMPORT  ECF_ClicheProprietario(char *);
extern "C" int DLL_IMPORT  ECF_NumeroLoja(char *);
extern "C" int DLL_IMPORT  ECF_NumeroCaixa(char *);
extern "C" int DLL_IMPORT  ECF_DataHoraImpressora(char *, char *);	
extern "C" int DLL_IMPORT  ECF_RetornoAliquotas(char *);
extern "C" int DLL_IMPORT  ECF_VerificaAliquotasIss(char *);
extern "C" int DLL_IMPORT  ECF_VerificaIndiceAliquotasIss(char *);
extern "C" int DLL_IMPORT  ECF_VerificaTotalizadoresNaoFiscais(char *);
extern "C" int DLL_IMPORT  ECF_VerificaTotalizadoresNaoFiscaisMFD(char *);
extern "C" int DLL_IMPORT  ECF_VerificaModoOperacao(char *);
extern "C" int DLL_IMPORT  ECF_RetornaIndiceComprovanteNaoFiscal(char *, char *);
extern "C" int DLL_IMPORT  ECF_LerAliquotasComIndice(char *);
extern "C" int DLL_IMPORT  ECF_ClicheProprietarioEx(char *);
extern "C" int DLL_IMPORT  ECF_VerificaDescricaoFormasPagamento(char *);
extern "C" int DLL_IMPORT  ECF_VerificaTotalizadoresNaoFiscaisEx(char *);
extern "C" int DLL_IMPORT  ECF_VerificaRelatorioGerencialProgMFD(char *);
extern "C" int DLL_IMPORT  ECF_CasasDecimaisProgramada(char *,char *);
extern "C" int DLL_IMPORT  ECF_VerificaTruncamento(char *);
extern "C" int DLL_IMPORT  ECF_DataHoraGravacaoUsuarioSWBasicoMFAdicional(char *datusu, char *datsofbas, char *adic);

// -------------------------------------------- RETORNO DE VALORES DO ULTIMO CUPOM / CUPOM CORRENTE
extern "C" int DLL_IMPORT  ECF_TipoUltimoDocumento(char *);
extern "C" int DLL_IMPORT  ECF_UltimoItemVendido(char *);
extern "C" int DLL_IMPORT  ECF_SubTotal(char *);
extern "C" int DLL_IMPORT  ECF_SubTotalComprovanteNaoFiscalMFD(char *);
extern "C" int DLL_IMPORT  ECF_ValorPagoUltimoCupom(char *texto);
extern "C" int DLL_IMPORT  ECF_NumeroCupom(char *);
extern "C" int DLL_IMPORT  ECF_VerificaFormasPagamento(char *);
extern "C" int DLL_IMPORT  ECF_VerificaFormasPagamentoMFD(char *);
extern "C" int DLL_IMPORT  ECF_UltimaFormaPagamento(char *,char *);
extern "C" int DLL_IMPORT  ECF_VerificaFormasPagamentoEx(char *);
extern "C" int DLL_IMPORT  ECF_TotaisVenda(char *);
extern "C" int DLL_IMPORT  ECF_ValorAcrescimosUltimoCupom(char *);
extern "C" int DLL_IMPORT  ECF_ValorDescontosUltimoCupom(char *);
extern "C" int DLL_IMPORT  ECF_ValorCancelamentosUltimoCupom(char *);
extern "C" int DLL_IMPORT  ECF_ValorCancelamentosUltimoCupomISS(char *);
extern "C" int DLL_IMPORT  ECF_ValorAliquotaUltimoCupom(char *);

// -------------------------------------------- RETORNO DE VALORES DO DIA 
extern "C" int DLL_IMPORT  ECF_Acrescimos(char *);
extern "C" int DLL_IMPORT  ECF_Descontos(char *);
extern "C" int DLL_IMPORT  ECF_ValorFormaPagamento(char *, char *);
extern "C" int DLL_IMPORT  ECF_ValorFormaPagamentoMFD(char *, char *);
extern "C" int DLL_IMPORT  ECF_ValorTotalizadorNaoFiscal(char *, char *);
extern "C" int DLL_IMPORT  ECF_ValorTotalizadorNaoFiscalMFD(char *, char *);
extern "C" int DLL_IMPORT  ECF_VerificaRecebimentoNaoFiscal(char *);
extern "C" int DLL_IMPORT  ECF_VerificaRecebimentoNaoFiscalMFD(char *);
extern "C" int DLL_IMPORT  ECF_Cancelamentos(char *);
extern "C" int DLL_IMPORT  ECF_GrandeTotal(char *);
extern "C" int DLL_IMPORT  ECF_VerificaTotalizadoresParciais(char *);
extern "C" int DLL_IMPORT  ECF_VerificaTotalizadoresParciaisMFD(char *);
extern "C" int DLL_IMPORT  ECF_VendaBruta(char *);
extern "C" int DLL_IMPORT  ECF_RetornaAcrescimoNF(char *);
extern "C" int DLL_IMPORT  ECF_RetornaDescontoNF(char *);
extern "C" int DLL_IMPORT  ECF_RetornaCancelamentoNF(char *);
extern "C" int DLL_IMPORT  ECF_RetornaTotalPagamentos(char *);
extern "C" int DLL_IMPORT  ECF_RetornaCNFNV(char *);
extern "C" int DLL_IMPORT  ECF_RetornaTroco(char *);
extern "C" int DLL_IMPORT  ECF_RetornaRegistradoresNaoFiscais(char *);
extern "C" int DLL_IMPORT  ECF_RetornaRegistradoresFiscais(char *);
extern "C" int DLL_IMPORT  ECF_RetornaValorComprovanteNaoFiscal(char *, char *);
extern "C" int DLL_IMPORT  ECF_AcrescimosICMSISS(char *, char *);
extern "C" int DLL_IMPORT  ECF_CancelamentosICMSISS(char *, char *);
extern "C" int DLL_IMPORT  ECF_DescontosICMSISS(char *, char *);

// -------------------------------------------- RETORNO DOS CONTADORES DIARIOS

extern "C" int DLL_IMPORT  ECF_NumeroIntervencoes(char *);
extern "C" int DLL_IMPORT  ECF_RetornaCOO(char *);
extern "C" int DLL_IMPORT  ECF_ContadorCupomFiscalMFD(char *);
extern "C" int DLL_IMPORT  ECF_NumeroCuponsCancelados(char *);
extern "C" int DLL_IMPORT  ECF_NumeroOperacoesNaoFiscais(char *);
extern "C" int DLL_IMPORT  ECF_ContadorComprovantesCreditoMFD(char *);
extern "C" int DLL_IMPORT  ECF_ComprovantesNaoFiscaisNaoEmitidosMFD(char *);
extern "C" int DLL_IMPORT  ECF_ContadorOperacoesNaoFiscaisCanceladasMFD(char *);
extern "C" int DLL_IMPORT  ECF_RetornaCNFCancelados(char *);
extern "C" int DLL_IMPORT  ECF_ContadorFitaDetalheMFD(char *);
extern "C" int DLL_IMPORT  ECF_ContadorRelatoriosGerenciaisMFD(char *);
extern "C" int DLL_IMPORT  ECF_NumeroReducoes(char *);
extern "C" int DLL_IMPORT  ECF_RetornaCRZ(char *);
extern "C" int DLL_IMPORT  ECF_COO(char *, char *);
extern "C" int DLL_IMPORT  ECF_ContadoresTotalizadoresNaoFiscais(char *);
extern "C" int DLL_IMPORT  ECF_ContadoresTotalizadoresNaoFiscaisMFD(char *);
extern "C" int DLL_IMPORT  ECF_VerificaRelatorioGerencialMFD(char *);
 
// -------------------------------------------- STATUS 
extern "C" int DLL_IMPORT  ECF_VerificaImpressoraLigada(void);
extern "C" int DLL_IMPORT  ECF_FlagsFiscais(unsigned int *);
extern "C" int DLL_IMPORT  ECF_FlagsFiscaisStr(char *);
extern "C" int DLL_IMPORT  ECF_VerificaEstadoImpressora(unsigned int *,unsigned int *,unsigned int *);
extern "C" int DLL_IMPORT  ECF_VerificaEstadoImpressoraMFD(unsigned int *, unsigned int *, unsigned int *, unsigned int *);

extern "C" int DLL_IMPORT  ECF_VerificaEstadoImpressoraStr(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_RetornoImpressora(unsigned int *, unsigned int *, unsigned int *);
extern "C" int DLL_IMPORT  ECF_RetornoImpressoraMFD(unsigned int *, unsigned int *, unsigned int *, unsigned int *);
extern "C" int DLL_IMPORT  ECF_RetornoImpressoraStr(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_VerificaTipoImpressora(unsigned int *);
extern "C" int DLL_IMPORT  ECF_VerificaTipoImpressoraStr(char *);
extern "C" int DLL_IMPORT  ECF_StatusEstendidoMFD(unsigned int *);
extern "C" int DLL_IMPORT  ECF_StatusCupomFiscal(char *);
extern "C" int DLL_IMPORT  ECF_StatusRelatorioGerencial(char *);
extern "C" int DLL_IMPORT  ECF_StatusComprovanteNaoFiscalVinculado(char *);
extern "C" int DLL_IMPORT  ECF_StatusComprovanteNaoFiscalNaoVinculado(char *);
extern "C" int DLL_IMPORT  ECF_VerificaModeloEcf(void);
extern "C" int DLL_IMPORT  ECF_VerificaHorarioVerao(char *);
extern "C" int DLL_IMPORT  ECF_VerificaZPendente(char *);
extern "C" int DLL_IMPORT  ECF_VerificaDiaAberto(char *);
extern "C" int DLL_IMPORT  ECF_PalavraStatus(char *);
extern "C" int DLL_IMPORT  ECF_PalavraStatusBinario(char *);
extern "C" int DLL_IMPORT  ECF_VerificaFlagCorteMFD(unsigned int *);
extern "C" int DLL_IMPORT  ECF_GeraRFD(char *);
extern "C" int DLL_IMPORT  ECF_MsgLog(char *, int ext);
extern "C" int DLL_IMPORT  ECF_FlagsFiscais3MFD(unsigned int *flag);
extern "C" int DLL_IMPORT  ECF_ObterMensagemStatus(char *);

// ---------------------------------------------------- DIVERSOS
extern "C" int DLL_IMPORT  ECF_PercentualLivreMFD(char *);
extern "C" int DLL_IMPORT  ECF_TotalLivreMFD(char *);
extern "C" int DLL_IMPORT  ECF_ReducoesRestantesMFD(char *);
extern "C" int DLL_IMPORT  ECF_RetornaCRZRestante(char *);
extern "C" int DLL_IMPORT  ECF_TamanhoTotalMFD(char *);
extern "C" int DLL_IMPORT  ECF_TempoRestanteComprovanteMFD(char *);
extern "C" int DLL_IMPORT  ECF_DataMovimento(char *);
extern "C" int DLL_IMPORT  ECF_CodigoModeloFiscal(char *, char *);

// ------------------------------------------------ RETORNO DE VALORES APOS A REDUCAO Z
extern "C" int DLL_IMPORT  ECF_DataHoraUltimoDocumentoMFD(char *);
extern "C" int DLL_IMPORT  ECF_DataHoraReducao(char *, char *);
extern "C" int DLL_IMPORT  ECF_DataMovimentoUltimaReducaoMFD(char *);
extern "C" int DLL_IMPORT  ECF_InicioFimCOOsMFD(char *,char *);
extern "C" int DLL_IMPORT  ECF_InicioFimGTsMFD(char *,char *);
extern "C" int DLL_IMPORT  ECF_GrandeTotalUltimaReducaoMFD(char *);
extern "C" int DLL_IMPORT  ECF_DadosUltimaReducao(char *);
extern "C" int DLL_IMPORT  ECF_DadosUltimaReducaoMFD(char *);
extern "C" int DLL_IMPORT  ECF_MapaResumo(void);
extern "C" int DLL_IMPORT  ECF_MapaResumoMFD(void);
extern "C" int DLL_IMPORT  ECF_DadosReducaoMFD(char *, char *);

// ----------------------------------------------------------- SINTEGRA
extern "C" int DLL_IMPORT  ECF_RegistrosTipo60(void);
extern "C" int DLL_IMPORT  ECF_RelatorioTipo60Mestre(void);
extern "C" int DLL_IMPORT  ECF_RelatorioTipo60Analitico(void);
extern "C" int DLL_IMPORT  ECF_RelatorioTipo60AnaliticoMFD(void);
extern "C" int DLL_IMPORT  ECF_RelatorioSintegraMFD(unsigned int, char *,char *,char *,char *,char *, char *,char *,char *,char *,char *, char *,char *, char *);
extern "C" int DLL_IMPORT  ECF_ArquivoSintegra2004MFD(unsigned int, char *,char *,char *,char *,char *, char *,char *,char *,char *,char *, char *, char *,char *, char *, char *, char *);

// ----------------------------------------------------------- CAPTURA
extern "C"  int DLL_IMPORT  ECF_LeituraXSerial(void);
extern "C" int DLL_IMPORT  ECF_LeituraMemoriaFiscalSerialData(char *, char *);
extern "C" int DLL_IMPORT  ECF_LeituraMemoriaFiscalSerialDataMFD(char *, char *, char *);
extern "C" int DLL_IMPORT  ECF_LeituraMemoriaFiscalSerialReducao(char *, char *);
extern "C" int DLL_IMPORT  ECF_LeituraMemoriaFiscalSerialReducaoMFD(char *, char *, char *);
extern "C"  int DLL_IMPORT  ECF_DownloadSB(char *);
extern "C"  int DLL_IMPORT  ECF_DownloadMF(char *);
extern "C"  int DLL_IMPORT  ECF_DownloadMFD(char *,char *,char *,char *,char *);
extern "C"  int DLL_IMPORT  ECF_FormatoDadosMFD(char *,char *,char *,char *,char *,char *,char *);
extern "C"  int DLL_IMPORT  ECF_CapturaDocumentos(char *, char *,char *, char *, char *);

// ----------------------------------------------------------- COTEPE
extern "C"  int DLL_IMPORT  ECF_TabelaMercadoriasServicos3404(char *,char *,char *);
extern "C"  int DLL_IMPORT  ECF_ReproduzirMemoriaFiscalMFD(char *,char *,char *,char *,char *);
extern "C"  int DLL_IMPORT  ECF_GeraRegistrosCAT52MFD(char *, char *);

// ----------------------------------------------------------- COdigo DE BARRAS
extern "C" int DLL_IMPORT  ECF_ConfiguraCodigoBarrasMFD(unsigned int, unsigned int, unsigned int, unsigned int,unsigned int);
extern "C" int DLL_IMPORT  ECF_CodigoBarrasCODABARMFD(char *);
extern "C" int DLL_IMPORT  ECF_CodigoBarrasPDF417MFD(unsigned int, unsigned int, unsigned int, unsigned int, char *);
extern "C" int DLL_IMPORT  ECF_CodigoBarrasCODE39MFD(char *);
extern "C" int DLL_IMPORT  ECF_CodigoBarrasEAN13MFD(char *);
extern "C" int DLL_IMPORT  ECF_CodigoBarrasEAN8MFD(char *);
extern "C" int DLL_IMPORT  ECF_CodigoBarrasITFMFD(char *);
extern "C" int DLL_IMPORT  ECF_CodigoBarrasUPCAMFD(char *);
extern "C" int DLL_IMPORT  ECF_CodigoBarrasUPCEMFD(char *);


int Conectado = 0;
char  BufLog[8*1024];

///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//funcoes globais

// *************************  WINDOWS WINDOWS WINDOWS 
//stream based I/O 
// When used with cin, the getline function that is supplied in the string library (VC++ 6.0) contains a 
// design problem - it requires the user to hit enter twice. It also places a null string in the input 
// buffer (ie, you have to test for and remove extra null strings). Microsoft Knowledge Base Article - 
// 240015 
// getline(cin,user_response); // This has a compiler design problem
// This can be fixed by editing line 165 of the file: 
// c:\Program Files\Microsoft Visual Studio\VC98\Include\STRING 
// Line 165 should be: 
// _I.rdbuf()->sbumpc();
// instead of: 
// _I.rdbuf()->snextc();
// ****************************************************************************************
void GetTexto(const char *msg,char *buf,int tam)
{
  if (tam == 0)
  {
      cout << "erro extensao zero" << endl;	
      return;
  }
	 	
  string strw;

  cout<< msg << "  ";
  cout.flush();

  cin.sync(); 

  if (cin.bad()) 
  {    // houve erro de leitura
    cin.clear();
    cout << "erro de leitura" << endl;
  }
  if (cin.eof()) 
  {    // houve fim de leitura
    cin.clear();
    cout << "fim de leitura" << endl;
  }
  if (cin.fail()) 
  {    // houve uma falha na leitura
    cin.clear();  
    cout << "falha de leitura" << endl;
  }

#ifndef WIN32
  if (cin.peek() == '\n')
     cin.get();
#endif

  getline(cin,strw,'\n');

  if (cin.bad()) 
  {    // houve erro de leitura
    cin.clear();
    cout << "erro de leitura" << endl;
  }
  if (cin.eof()) 
  {    // houve fim de leitura
    cin.clear();
    cout << "fim de leitura" << endl;
  }
  if (cin.fail()) 
  {    // houve uma falha na leitura
    cin.clear();  
    cout << "falha de leitura" << endl;
  }

  strncpy(buf,strw.c_str(),tam);
  buf[tam] = '\0';

  cout << endl;
  cin.sync();
  cin.clear();
}


int Message(char *msg,char *caption)
{
  cout<<caption<<"   -->>   "<<msg<<endl;
  return 0;
}

#define Y (int)'s'
int MessageQ(char *msg,char *caption)
{
  char c;
  char soun[16];
  string msgw; 

  msgw = (string) caption + (string) "   -->>   " + (string) msg +  (string) " (Digite s ou n): ";
  do
  {
     soun[0] = '\0';
     GetTexto(msgw.c_str(),soun,1);	
     c = soun[0];	
  }
  while (c != 's' && c !='n' && c !='S' && c !='N');

  if (c == 'S')
      c = 's';
  return (int)c;
}

void Pausa(bool x = false)
{
   char c;
   char q[16];

#ifndef WIN32
   if (x == true)
       cout<<"Use <shift>+Page UP ou <shift>+Page DOWN, para navegar."<<endl;
#endif

   do
   {
     q[0] = '\0';
     GetTexto("Digite 'q' para continuar...",q,1);	
     c = q[0];	
   }
   while (c != 'q');
   ECF_MsgLog(BufLog,sizeof(BufLog));		// descarta  mensagens de log geradas pela biblioteca
   return;
}

void Strreverse(char* begin, char* end) {
    char aux;
    while(end>begin)
          aux=*end, *end--=*begin, *begin++=aux;
}
	
char * itoa(int value, char* str, int base) {
	static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";
	char* wstr=str;
	int sign;

	// Validate base
	if (base<2 || base>35){ *wstr='\0'; return NULL; }

	// Take care of sign
	if ((sign=value) < 0) value = -value;
	
	// Conversion. Number is reversed.
	do *wstr++ = num[value%base]; while(value/=base);
	if(sign<0) *wstr++='-';
	*wstr='\0';
	
	// Reverse string
	Strreverse(str,wstr-1);
	
	return str;
}

int Resposta;

class memo{

public:
	struct buf{
			   void Add(string str1)
				{strbuff += str1+"\n";
				 ECF_MsgLog(BufLog,sizeof(BufLog));
				 strbuff += (string) BufLog;
				 strbuff += "\n";
				 BufLog[0] = '\0';
				}
			   void Mostra(bool espera=true);
			   void Limpar();
			   private:
				string strbuff;
			}Lines;
}Memo1;

void memo::buf::Mostra(bool espera)
{ 
   cout<<strbuff<<endl;
   if (espera == true)
      Pausa(true);
   cout << endl;
}

void memo::buf::Limpar()
{
#ifndef WIN32
    strbuff.clear();
#else
	strbuff = "";
#endif
    strbuff = "Limpado o buffer! \n\n\n";
}

char num[64];
char * inttostr(int n)
{  return itoa(n,num,10);
}

void LeHoraSistema(char *hora)
{ time_t t;
  tm *tmt;

  time(&t);
  tmt=localtime(&t);

  sprintf(hora,"%02d:%02d:%02d",tmt->tm_hour,tmt->tm_min,tmt->tm_sec);
}

void LeDataSistema(char *data)
{ time_t t;
  tm *tmt;
  char aux[10];

  time(&t);
  tmt=localtime(&t);

  *data = '\0'; 
  if (tmt->tm_mday<10) 
      strcat(data,"0");
  strcat(data,itoa(tmt->tm_mday,aux,10));
  strcat(data,"/");
  if (tmt->tm_mon+1<10) 
  strcat(data,"0");
  strcat(data,itoa(tmt->tm_mon+1,aux,10));
  strcat(data,"/");
  if (tmt->tm_year-100<10) 
  strcat(data,"0");
  strcat(data,itoa(tmt->tm_year-100,aux,10));
}

void MRetornoECF (bool MostraAgora = false)
{ unsigned int sack,St1,St2,St3;

    Resposta = ECF_RetornoImpressoraMFD(&sack,&St1,&St2,&St3);
        Memo1.Lines.Add(string("RetornoImpressoraMFD: ")+string(inttostr(Resposta)));
        Memo1.Lines.Add(string("Estado=")+string(inttostr(sack))+
					 string(" - ")+
					 string(inttostr(St1))+
					 string(" - ")+
					 string(inttostr(St2))+
					 string(" - ")+
					 string(inttostr(St3))
			      );
        Memo1.Lines.Add("");
    if (MostraAgora == true)
    {
        Memo1.Lines.Mostra();
    }
}

void MStatusECF (bool MostraAgora = false)
{  unsigned int sack,St1,St2,St3;
    Resposta = ECF_VerificaEstadoImpressoraMFD(&sack,&St1,&St2,&St3);
        Memo1.Lines.Add(string("Verifica Estado Impressora:")+string(inttostr(Resposta)));
        Memo1.Lines.Add(string("Estado=")+string(inttostr(sack))+
					 string(" - ")+
					string(inttostr(St1))+
					 string(" - ")+
					string(inttostr(St2))+
					 string(" - ")+
					string(inttostr(St3))
			      );
        Memo1.Lines.Add("");
    if (MostraAgora == true)
    {
        Memo1.Lines.Mostra();
    }
}


void reportar(const char * cabecalho,char *texto,char sep=0)
{ char aux[500];
   stringstream sm;
   cout<<cabecalho;
   if (sep)
   { 
       cout << endl;
       sm<<texto<<endl;
       do
       {
          sm.getline(aux,500,sep);
          cout<<aux<<endl;
       }
       while (!sm.eof());
   }
   else
      cout<< "  ->    "<<texto<<endl;
}

void ExibirArquivo(char *nome)
{
   ifstream infile;

   infile.open (nome, ifstream::in);
   if (infile.is_open())
   {
      while (infile.good())
            cout << (unsigned char) infile.get();
      infile.close();
      cout << endl << endl;
   }
   else
   {
      cout << "Erro na abertura do arquivo" << nome;
   }
}

void GetTextoPos(char *msg, string &inleiaute,unsigned int pos,unsigned int ext)
{   
    char *texto = NULL;
    stringstream w;

    if (ext != 0)					// informou extensao ?
    {
        texto =  new char [ext+1];			// aloca heap
		if (texto)
		{						// pega substring pos e ext
			if (inleiaute.size() > (pos+ext))
				strcpy(texto,(inleiaute.substr(pos,ext)).c_str());
			else
				texto[0] = '\0';
            if (texto[0] != 0)
               cout << msg << texto << endl; 		// se tem texto - display

            GetTexto(msg,texto,ext);			// aceita alteracao
			w.width(3);					// preenche com zeros
            w.fill('0');
            w << right << texto;			// insere o texto digitado just right 
			if (inleiaute.size() > (pos+2))
				inleiaute.replace(pos,ext,w.str());		// substitui
			else
				inleiaute.append(w.str());
 			delete texto;				// libera heap
            return;
        }
    }
    return;
}


// ST1
// bit 7    =  fim de papel 				15
// bit 6    =  pouco papel 				14
// bit 5    =  erro relogio 				13
// bit 4    =  impressora em erro 			12
// bit 3    =  especifico protocolo - irrelevante 	11
// bit 2    =  comando inexistente 			10
// bit 1    =  cupom fiscal aberto 			9	
// bit 0    =  especifico protocolo  - irrelevante 	8

// ST2
// bit 7    =  especifico protocolo  - irrelevante 	7
// bit 6    =  memoria fiscal lotada 			6	
// bit 5    =  erro RAM 				5
// bit 4    =  aliquota nao programada. 		4
// bit 3    =  capacidade de aliquotas esgotada 	3	
// bit 2    =  cancelamento nao permitido. 		2
// bit 1    =  CNPJ/IE nao programados 			1
// bit 0    =  comando nao executado. 			0

void DecodificaStatus(unsigned int *iAck, unsigned int *aSt1, unsigned int *aSt2 )
{
  int n;
  unsigned int iSt1 = *aSt1;
  unsigned int iSt2 = *aSt2;
  char strw[128]; 
  string  s;  
  string  legenda("Estado: (");
  string  Textinfo;

  Textinfo =  legenda;
  strcpy(strw,inttostr((int) iSt2));

  s = string(strw);
  Textinfo += s;
  Textinfo += string(" , ")+string(inttostr((int) iSt1))+string(") : ");
  iSt2 &= 0xff;
  iSt2 |= (iSt1<<8);
  
  for (n=15;n >= 0;--n,iSt2=iSt2<<1)
  {if (iSt2&0x8000)
    switch (n)
	{
		case 0:
				Textinfo+=string("comando nao executado     ");
			break; 
		case 1:
				Textinfo+=string("CNPJ/IE nao programados     ");
			break; 
		case 2:
				Textinfo+=string("cancelamento nao permitido     ");
			break; 
		case 3:
				Textinfo+=string("capacidade de aliquotas esgotada (ECF conectado ?)    ");
			break; 
		case 4:
				Textinfo+=string("aliquota nao programada     ");
			break; 
		case 5:
				Textinfo+=string("erro RAM  (ECF conectado ?)  ");
			break; 
		case 6:
				Textinfo+=string("memoria fiscal lotada     ");
			break; 
		case 7:
				Textinfo+=string("protocolo     ");
			break; 
		case 8:
				Textinfo+=string("protocolo     ");
			break; 
		case 9:
				Textinfo+=string("cupom fiscal aberto     ");
			break; 
		case 10:
				Textinfo+=string("comando inexistente   ");
			break; 
		case 11:
				Textinfo+=string("protocolo      ");
			break; 
		case 12:
				Textinfo+=string("impressora em erro     ");
			break; 
		case 13:
				Textinfo+=string("erro relogio     ");
			break; 
		case 14:
				Textinfo+=string("pouco papel     ");
			break; 
		case 15:
				Textinfo+=string("fim de papel     ");
			break; 
	}
  }
cout<<Textinfo<<endl;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Funcoes de menu.

//		*********************************************************
//		*							*
//		*							*
//		*     E     M     I     S     S     O	  E     S       *				
//		*							*
//		*							*
//		*********************************************************

void AbertDia()
{
    char valor[15];
    char meio[16];

    GetTexto("Valor do suprimento: ",valor,14);
    if (valor[0] == 0)
    {
	Pausa();
        return;
    }

    GetTexto("Nome do meio de pagamento",meio,15);
    Resposta = ECF_AberturaDoDia(valor,meio);
    Memo1.Lines.Add(string("ECF_AberturaDoDia - Resposta: ")+string(inttostr(Resposta)));
    Pausa();
}

void CupomFiscal()
{
    int lim;
    Resposta=0;
    char  buf[4];

    GetTexto("Numero de itens a serem registrados: ",buf,3);
    if (buf[0] == 0 || atoi(buf)==0)
	return;

    lim = atoi(buf);
 
    Resposta= ECF_AbreCupomMFD( "11.222.333-45","Fulano de Tal","Rua X, 1234");
    if (Resposta != 1)
	cout << "Erro" << endl;
	
    Memo1.Lines.Add(string("ECF_AbreCupomMFD - Resposta: ")+string(inttostr(Resposta)));

    if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();

    while (Resposta == 1)
    {	
    	Resposta = ECF_AumentaDescricaoItem("Leite longa vida integral UHT     ");
    	Memo1.Lines.Add(string("ECF_AumentaDescricaoItem - Resposta: ")+string(inttostr(Resposta)));


    	Resposta= ECF_VendeItem( "000001", "Produto 01 ","II","I", "1", 2,  "100", "$", "0" );
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_VendeItem - Resposta: ")+string(inttostr(Resposta)));
	
    	if (Resposta > 0)
    	   MStatusECF ();
    	else
    	   MRetornoECF();

    	if (--lim <= 0)
	   break;
    
	Resposta = ECF_AumentaDescricaoItem("Leite semi desnatado  Vigor longa vida     ");
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_AumentaDescricaoItem - Resposta: ")+string(inttostr(Resposta)));

    	Resposta= ECF_VendeItem( "000002", "Produto 02","FF","I", "1", 3,  "1343", "$", "0" );
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_VendeItem - Resposta: ")+string(inttostr(Resposta)));

    	if (Resposta > 0)
     	   MStatusECF ();
    	else
     	   MRetornoECF();

    	if (--lim <= 0)
	   break;

    	Resposta = ECF_AumentaDescricaoItem("Achocolatado Nescau 500g   ");
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_AumentaDescricaoItem - Resposta: ")+string(inttostr(Resposta)));

    	Resposta= ECF_VendeItem( "000003", "Produto 03","NN","I", "1", 2,  "100", "$", "0" );
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_VendeItem - Resposta - :")+string(inttostr(Resposta)));

    	if (Resposta > 0)
     	    MStatusECF ();
        else
            MRetornoECF();

    	if (--lim <= 0)
	   break;

	Resposta = ECF_UsaUnidadeMedida("cx");
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_UsaUnidadeMedida - Resposta: ")+string(inttostr(Resposta)));

    	Resposta = ECF_AumentaDescricaoItem("Arroz especial 5 kg     ");
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_AumentaDescricaoItem - Resposta: ")+string(inttostr(Resposta)));

    	Resposta= ECF_VendeItem( "000004", "Produto 04","II","I", "0010", 3,  "2355", "$", "0" );
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_VendeItem - Resposta: ")+string(inttostr(Resposta)));

    	if (Resposta > 0) 
     	    MStatusECF ();
    	else
     	    MRetornoECF();

    	if (--lim <= 0)
	   break;

    	Resposta = ECF_AumentaDescricaoItem("Micro computador Dual Core Sweda completo gabinete especial");
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_AumentaDescricaoItem - Resposta: ")+string(inttostr(Resposta)));

    	Resposta= ECF_VendeItem( "000005", "Produto 05","II","I", "1", 3,  "1349", "%", "1000" );
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_VendeItem - Resposta: ")+string(inttostr(Resposta)));

    	if (Resposta > 0)
    	   MStatusECF ();
    	else
    	   MRetornoECF();

    	if (--lim <= 0)
	   break;

    	Resposta = ECF_AumentaDescricaoItem("Yogurte sabor frutas vermelhas tamanho familia   ");
        if (Resposta != 1)
	   cout << "Erro" << endl;

    	Memo1.Lines.Add(string("ECF_AumentaDescricaoItem - Resposta: ")+string(inttostr(Resposta)));

    	Resposta= ECF_VendeItem( "000005", "Produto 06","II","F", "1500", 2,  "100", "$", "50" );
        if (Resposta != 1)
	{
	   cout << "Erro" << endl; 
   	   if ( MessageQ("Continua tentando (s/n) ?","")!= Y)
	        return;
	}

    	Memo1.Lines.Add(string("ECF_VendeItem - Resposta: ")+string(inttostr(Resposta)));

   	if (Resposta > 0)
      	   MStatusECF ();
   	else
           MRetornoECF();

    	if (--lim <= 0)
	   break;
    }

    if (Resposta != 1)
	cout<<"ERRO NO REGISTRO DE ITENS NA VENDA !"<<endl;

    Resposta= ECF_FechaCupom("Dinheiro", "A", "$", "0", "1000.00","Volte Sempre");
    if (Resposta == -24)
    {
                cout<<"Meio de Pagamento nao cadastrado !"<<endl;
                Resposta= ECF_CancelaCupom();
                Memo1.Lines.Add("");
                Memo1.Lines.Add(string("Cancela Cupom Fiscal:")+string(inttostr(Resposta)));
                Memo1.Lines.Add("");
		Pausa();
                return;
    }
   Memo1.Lines.Add(string("Fechar Cupom:")+inttostr(Resposta));
   Memo1.Lines.Add("");

  if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();
  Pausa();
}

void Venda1()
{
    char  Codigo[50];
    char  Descricao[202];
    char  Aliquota[10];
    char  ValUnit[16];
    char  Quant[10];
    char  Acres[16];
    char  Desc[16];	
    char  Unidade[3];	
    char  Valor[16]; 	
    char  TipoAcrDesc[2];
    char  TipoValDescAcres[2];
    char  Item[4];
    char  Parcelas[3];

    char  cLinhas[1001];

    Resposta=0;

    Resposta= ECF_AbreCupom("");
    Memo1.Lines.Add(string("ECF_AbreCupom - Resposta: ")+string(inttostr(Resposta)));

    while (Resposta == 1)
    {
        GetTexto("Codigo do produto (um zero = cancela item/vazio = encerra/ponto= aborta): ",Codigo,49);
	if (Codigo[0] == '.')
	    return;

	if (Codigo[0] == 0)
	   break;

	if (Codigo[0] == '0' && Codigo[1] <= ' ')
	{
	    GetTexto("Numero do item: ",Item,3);
 	    if (Item[0] == 0)	
	    {
	        Resposta = ECF_CancelaItemAnterior();
        	Memo1.Lines.Add(string("ECF_CancelaItemAnterior - Resposta:  ")+string(inttostr(Resposta)));
	    }
	    else
	    {	
	        Resposta = ECF_CancelaItemGenerico(Item);
        	Memo1.Lines.Add(string("ECF_CancelaItemGenerico - Resposta:  ")+string(inttostr(Resposta)));
	    }
	    Resposta = 1;
	    continue;
	}

        GetTexto("Descricao do produto: ",Descricao,201);

        GetTexto("Aliquota ou Codigo do imposto: ",Aliquota,9);

        GetTexto("Quantidade em 7 digitos (3 casas decimais): ",Quant,8);

        GetTexto("Preco unitario com 3 casas decimais: ",ValUnit,9);

        GetTexto("Acrescimo no item em valor: ",Acres,10);

        GetTexto("Desconto no item em valor: ",Desc,10);

        GetTexto("Unidade de medida: ",Unidade,2);

        Resposta= ECF_VendeItemDepartamento(Codigo, Descricao, Aliquota, ValUnit, Quant, Acres, Desc, "", Unidade );
        Memo1.Lines.Add(string("ECF_VendeItemDepartamento - Resposta: ")+string(inttostr(Resposta)));

        GetTexto("Informe 'D' ou 'A' se o item a ser repetido tera' desconto ou acrescimo: ",  TipoAcrDesc,1);

        if (TipoAcrDesc[0] != 0)
	{
           GetTexto("Percentual: ",Desc,6);
	}
	else
	    Desc[0] = '\0';

	Resposta = ECF_UsaUnidadeMedida(Unidade);
    	Memo1.Lines.Add(string("ECF_UsaUnidadeMedida - Resposta: ")+string(inttostr(Resposta)));

	Resposta = ECF_VendeItemTresDecimais(Codigo, Descricao, Aliquota, Quant, ValUnit,TipoAcrDesc, Desc);
        Memo1.Lines.Add(string("ECF_VendeItemTresDecimais - Resposta: ")+string(inttostr(Resposta)));

	do
	{
           GetTexto("1= desc item   2= acrescimo item  3= canc desc item  4= canc acresc item    outro= prox item: ", Codigo,1);
	   switch (Codigo[0])
	   {	
		case '1':		// desc no item
	            GetTexto("Numero do item a descontar: ",Item,3);

		    GetTexto("Digite '$' se for valor ou '%' se for percentual: ",TipoAcrDesc,1);

	            GetTexto("Valor/percentual do desconto: ",Desc,10);

		    Resposta = ECF_AcrescimoDescontoItemMFD(Item,"D", TipoAcrDesc, Desc);
        	    Memo1.Lines.Add(string("ECF_AcrescimoDescontoItemMFD - Resposta: ")+string(inttostr(Resposta)));
		break;
		case '2':		// acrescimo no item	
	            GetTexto("Numero do item que recebe o acrescimo: ",Item,3);

		    GetTexto("Digite '$' se for valor ou '%' se for percentual: ",TipoAcrDesc,1);

	            GetTexto("Valor/percentual do acrescimo: ",Desc,10);

		    Resposta = ECF_AcrescimoDescontoItemMFD(Item,"A", TipoAcrDesc, Desc);
        	    Memo1.Lines.Add(string("ECF_AcrescimoDescontoItemMFD - Resposta: ")+string(inttostr(Resposta)));
		break;
		case '3':		// cancela desconto	
	            GetTexto("Numero do item com o desconto a ser cancelado: ",Item,3);

	            GetTexto("A=acrescimo D=desconto U=ultimo X=os dois: ",TipoAcrDesc,1);

		    Resposta = ECF_CancelaAcrescimoDescontoItemMFD(TipoAcrDesc,Item);
        	    Memo1.Lines.Add(string("ECF_CancelaAcrescimoDescontoItemMFD - Resposta: ")+string(inttostr(Resposta)));
		break;
		case '4':		// cancela acrescimo
	            GetTexto("Numero do item com o acrescimo ser cancelado: ",Item,3);

	            GetTexto("A=acrescimo D=desconto U=ultimo X=os dois : ",TipoAcrDesc,1);

		    Resposta = ECF_CancelaAcrescimoDescontoItemMFD(TipoAcrDesc,Item);
        	    Memo1.Lines.Add(string("ECF_CancelaAcrescimoDescontoItemMFD - Resposta: ")+string(inttostr(Resposta)));
		break;
		default:
		   Codigo[0] = '\0';
		break;
	   }
	}
	while (Codigo[0]!='\0');
	Resposta = 1;
    }

   GetTexto("Digite 'A' se for acrescimo, 'D' se for desconto,  'x' para ambos   outro=encerra: ", TipoAcrDesc,1);

   if (TipoAcrDesc[0] != 0)
   { 
      GetTexto("Digite '$' se for valor ou '%' se for percentual: ",TipoValDescAcres,1);

      if (TipoAcrDesc[0]== 'A' || TipoAcrDesc[0]== 'a' || TipoAcrDesc[0]== 'X' || TipoAcrDesc[0]== 'x' )
      {
          GetTexto("Digite o Valor/percentual do acrescimo no total: ",Acres,14);
      }
      else
         Acres[0] = '\0';
      if (TipoAcrDesc[0]== 'D' || TipoAcrDesc[0]== 'd' || TipoAcrDesc[0]== 'X' || TipoAcrDesc[0]== 'x' )
      {
          GetTexto("Digite o Valor/percentual do desconto no total: ",Desc,14);
      }
      else
 	 Desc[0] = '\0';
   }
   else
   {
      TipoAcrDesc[0] = TipoValDescAcres[0] = Desc[0] = Acres[0] = '\0';	
   }
   Resposta = ECF_IniciaFechamentoCupomMFD(TipoAcrDesc,TipoValDescAcres, Acres, Desc);
   Memo1.Lines.Add(string("ECF_IniciaFechamentoCupomMFD - Resposta: ")+string(inttostr(Resposta)));

   Resposta = ECF_IdentificaConsumidor("Casa Rio Prata", "Rua Frei Caneca, 156 - Cidade Nova - Rio de Janeiro", "123456789-01");
   Memo1.Lines.Add(string("ECF_IdentificaConsumidor - Resposta: ")+string(inttostr(Resposta)));

   GetTexto("Nome do meio de pagamento que tem TEF habilitado: ",Descricao,15);
   if (Descricao[0] == 0)
       return; 	 	
   GetTexto("Valor do meio de pagamento: ",Valor,14);
	 
   GetTexto("Quantidade de parcelas TEF: ",Parcelas,2);

   if (Valor[0] != 0)
   {   
      Resposta= ECF_EfetuaFormaPagamentoMFD(Descricao,Valor,Parcelas,"RG 123456789   TEL 5574-56-44");
      Memo1.Lines.Add(string("ECF_EfetuaFormaPagamentoMFD - Resposta: ")+string(inttostr(Resposta)));
      Memo1.Lines.Add("");
      if (Resposta == -24)
      {  MessageQ("Meio de Pagamento nao cadastrado.","");
         Pausa();
         return;
      }
   }
   if ( MessageQ("Deseja imprimir informacao suplementar (s/n) ?","")== Y)
   {
       GetTexto("Digite informacao:  ", cLinhas,(8*60));
   }
 
   Resposta = ECF_FechaCupomResumido(Descricao,cLinhas);
   Memo1.Lines.Add(string("ECF_FechaCupomResumido - Resposta: ")+string(inttostr(Resposta)));

   if ( MessageQ("Deseja imprimircomprovante TEF (s/n) ?","")!= Y)
       return;

   if ( MessageQ("Deseja imprimir texto do comprovante TEF (s/n) ?","")== Y)
   {
       GetTexto("Conteudo do comprovante TEF: ",cLinhas,1000);
   }

   Resposta= ECF_AbreComprovanteNaoFiscalVinculado(Descricao, "", "");
   Memo1.Lines.Add(string("ECF_AbreComprovanteNaoFiscalVinculado - Resposta: ")+string(inttostr(Resposta)));

   Resposta  = ECF_UsaComprovanteNaoFiscalVinculado(cLinhas);
   Memo1.Lines.Add(string("ECF_UsaComprovanteNaoFiscalVinculado - Resposta: ")+string(inttostr(Resposta)));

   Resposta= ECF_FechaComprovanteNaoFiscalVinculado();
   Memo1.Lines.Add(string("ECF_FechaComprovanteNaoFiscalVinculado - Resposta: ")+string(inttostr(Resposta)));
   Memo1.Lines.Add("");

   if (MessageQ("Deseja imprimir segunda via? (s/n) ","")== Y)
   {
       Resposta=ECF_SegundaViaNaoFiscalVinculadoMFD();
       Memo1.Lines.Add(string("ECF_SegundaViaNaoFiscalVinculadoMFD - Resposta:  ")+string(inttostr(Resposta)));
       Memo1.Lines.Add("");
   }
}

void vendas2()
{
   char cnpjcpf[21];
   char nome[31];
   char endereco[81];  

   char totalc[15];

    Resposta=0;

    GetTexto("CPF/CNPJ do consumidor: ",cnpjcpf,20);
    GetTexto("Nome do consumidor: ",nome,30);
    GetTexto("Endereco do consumidor: ",endereco,80);

    cout << "Aguarde..." << endl;

    Resposta= ECF_AbreCupomMFD(cnpjcpf,nome,endereco);
    Memo1.Lines.Add(string("ECF_AbreCupomMFD - Resposta: ")+string(inttostr(Resposta)));

    if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();

    Resposta=  ECF_VendeItem( "000001", "Produto 01 ","II","I", "10", 2,  "200", "$", "0" );
    Memo1.Lines.Add(string("ECF_VendeItem - Resposta: ")+string(inttostr(Resposta)));

    if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();

    Resposta = ECF_DescontoSobreItemVendido("001","%","5000");
    Memo1.Lines.Add(string("ECF_DescontoSobreItemVendido - Resposta: ")+string(inttostr(Resposta)));

    Resposta= ECF_IniciaFechamentoCupom( "D", "$","0,20" );
    Memo1.Lines.Add(string("ECF_IniciaFechamentoCupom - Resposta: ")+string(inttostr(Resposta)));

    if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();

    Resposta= ECF_SubTotal(totalc);
    Memo1.Lines.Add(string("ECF_SubTotal - Resposta: ")+totalc);

    if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();

    Resposta = ECF_EfetuaFormaPagamentoDescricaoForma("Dinheiro","050","pagavel no dia 31/03/2008 - RG 999999999 - telefone (11) 123-45-67");
    Memo1.Lines.Add(string("ECF_EfetuaFormaPagamentoDescricaoForma - Resposta: ")+string(inttostr(Resposta)));

    Resposta = ECF_FechaCupom("Dinheiro", "A", "$", "0", totalc,"Volte Sempre");
    Memo1.Lines.Add(string("ECF_FechaCupom - Resposta: ")+string(inttostr(Resposta)));
    Memo1.Lines.Add("");

    if (Resposta == -24 )
    {
       Message("","Meio de Pagamento nao cadastrado.");
       Resposta= ECF_CancelaCupom();
       Memo1.Lines.Add("");
       Memo1.Lines.Add(string("ECF_CancelaCupom - Resposta: ")+string(inttostr(Resposta)));
       Memo1.Lines.Add("");
       Pausa();
       return;
    }

    if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();

  Resposta = ECF_AcionaGaveta();
  Memo1.Lines.Add(string("ECF_AcionaGaveta - Resposta: ")+string(inttostr(Resposta)));

    if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();

  Pausa();
}

void vender()
{
	int n;

        cout << "Aguarde..." << endl;

	Resposta = ECF_AbreCupom("987654321-09"); // Opcional

	for (n= 0; n < 10; ++n)
	{
	     Resposta = ECF_VendeItem("001", "Leite", "SI", "I", "2", 2, "200", "%", "0000");
	     Memo1.Lines.Add(string("ECF_VendeItem - Resposta: ")+string(inttostr(Resposta)));
	}
	Resposta = ECF_AcrescimoDescontoSubtotalMFD("A","$","600");
	Memo1.Lines.Add(string("ECF_AcrescimoDescontoSubtotalMFD - Resposta: ")+string(inttostr(Resposta)));

	Resposta = ECF_AcrescimoDescontoSubtotalMFD("D","$","300");
	Memo1.Lines.Add(string("ECF_AcrescimoDescontoSubtotalMFD - Resposta: ")+string(inttostr(Resposta)));

	Resposta = ECF_CancelaAcrescimoDescontoSubtotalMFD("D");
	Memo1.Lines.Add(string("ECF_CancelaAcrescimoDescontoSubtotalMFD - Resposta: ")+string(inttostr(Resposta)));

	Resposta = ECF_CancelaAcrescimoDescontoSubtotalMFD("A");
	Memo1.Lines.Add(string("ECF_CancelaAcrescimoDescontoSubtotalMFD - Resposta: ")+string(inttostr(Resposta)));

	Resposta = ECF_EfetuaFormaPagamento("Dinheiro", "10000");
	Memo1.Lines.Add(string("ECF_EfetuaFormaPagamento - Resposta: ")+string(inttostr(Resposta)));

	Resposta = ECF_TerminaFechamentoCupom("Volte sempre");
	Memo1.Lines.Add(string("ECF_TerminaFechamentoCupom - Resposta: ")+string(inttostr(Resposta)));

	if (Resposta > 0)
	    MStatusECF ();
	else
	    MRetornoECF();
    Pausa();
}

void SegCupom()
{
   Resposta = ECF_CupomAdicionalMFD();
   Memo1.Lines.Add(string("ECF_CupomAdicionalMFD - Resposta: ")+string(inttostr(Resposta)));
   Pausa();
}

void RecebeNaoFiscal()
{ 
   char indice[3];
   char valor[15];
   char nome[16];

   GetTexto("Digite o indice do totalizador: ",indice,2);
   if (indice[0] == 0)
   {
      Pausa();
      return;
   }
   GetTexto("Valor: ",valor,14);

   GetTexto("Nome do meio de pagamento: ",nome,15);

   Resposta = ECF_RecebimentoNaoFiscal(indice, valor, nome);
   Memo1.Lines.Add(string("ECF_RecebimentoNaoFiscal - Resposta: ")+string(inttostr(Resposta)));

   if (Resposta > 0)
     MStatusECF ();
   else
     MRetornoECF();
   Pausa();
}

void RecebeVariosNaoFiscal()
{ 
   char indice[3];
   char valor[15];
   char nome[16];
   char TipoDescAcres[2];
   char TipoValDescAcres[2];
   char ValDesc[15];
   char ValAcres[15];

   char cnpjcpf[21];
   char nome2[31];
   char endereco[81];  

   GetTexto("CPF/CNPJ do consumidor: ",cnpjcpf,20);
   GetTexto("Nome do consumidor: ",nome2,30);
   GetTexto("Endereco do consumidor: ",endereco,80);

   Resposta = ECF_AbreRecebimentoNaoFiscalMFD(cnpjcpf,nome2,endereco);
   Memo1.Lines.Add(string("ECF_AbreRecebimentoNaoFiscalMFD - Resposta: ")+string(inttostr(Resposta)));

   do
   {
   	GetTexto("Digite o indice do totalizador: ",indice,2);

	if (indice[0] == 0)
	   break;
	
   	GetTexto("Valor: ",valor,14);

   	Resposta = ECF_EfetuaRecebimentoNaoFiscalMFD(indice,valor);
   	Memo1.Lines.Add(string("ECF_EfetuaRecebimentoNaoFiscalMFD - Resposta: ")+string(inttostr(Resposta)));
	if (Resposta != 1)
	   cout << "Erro: " << dec << Resposta << endl;
   }
   while (Resposta == 1);

   cout << "Encerrando o comprovante..."<< endl;

   GetTexto("Digite 'A' se for acrescimo, 'D' se for desconto ou 'x' para ambos : ",TipoDescAcres,1);

   if (TipoDescAcres[0] != 0)
   { 
      GetTexto("Digite '$' se for valor ou '%' se for percentual: ",TipoValDescAcres,1);

      if (TipoDescAcres[0] == 'A' || TipoDescAcres[0] == 'a' || TipoDescAcres[0] == 'X' || TipoDescAcres[0] == 'x' )
      {
          GetTexto("Digite o Valor/percentual do acrescimo no   T O T A L: ",ValAcres,14);
      }
      else
         ValAcres[0] = '\0';
      if (TipoDescAcres[0] == 'A' || TipoDescAcres[0] == 'a' || TipoDescAcres[0] == 'X' || TipoDescAcres[0] == 'x' )
      {
          GetTexto("Digite o Valor/percentual do desconto no   T O T A L: ",ValDesc,14);
      }
      else
 	 ValDesc[0] = '\0';
   }
   else
   {
      TipoDescAcres[0] = TipoValDescAcres[0] = ValDesc[0] = ValAcres[0] = '\0';	
   }
   Resposta = ECF_IniciaFechamentoRecebimentoNaoFiscalMFD(TipoDescAcres, TipoValDescAcres, ValAcres, ValDesc);
   Memo1.Lines.Add(string("ECF_IniciaFechamentoRecebimentoNaoFiscalMFD - Resposta: ")+string(inttostr(Resposta)));
   
   GetTexto("Nome do meio de pagamento: ",nome,15);

   GetTexto("Valor: ",valor,14);

   Resposta = ECF_EfetuaFormaPagamentoNaoFiscal(nome, valor,"dados do meio de pagamento");
   Memo1.Lines.Add(string("ECF_EfetuaFormaPagamentoNaoFiscal - Resposta: ")+string(inttostr(Resposta)));

   if (Resposta > 0)
     MStatusECF ();
   else
     MRetornoECF();

   Resposta = ECF_FechaRecebimentoNaoFiscalMFD("O cliente sempre tem razao !!!");
   Memo1.Lines.Add(string("ECF_FechaRecebimentoNaoFiscalMFD - Resposta: ")+string(inttostr(Resposta)));

   if (Resposta > 0)
     MStatusECF ();
   else
     MRetornoECF();
   Pausa();
}

void RecebeVariosNaoFiscalOpcao2()
{
   char indice[3];
   char item[4];
   char valor[15];
   char nome[16];
   char TipoDescAcres[2];
   char TipoValDescAcres[2];
   char ValDescAcres[15];
   char buf[81];

   GetTexto("Digite o indice do totalizador: ",indice,2);

   if (indice[0] == 0)
   {
       Pausa();
       return;
   }	
   GetTexto("Valor: ",valor,14);

   GetTexto("Valor ou % do acrescimo/desconto do item a ser registrado: ",ValDescAcres,14);

   if (ValDescAcres[0] != 0)
   { 
      GetTexto("Digite 'A' se for acrescimo ou 'D' se for desconto: ",TipoDescAcres,1);

      GetTexto("Digite '$' se for valor ou '%' se for percentual: ",TipoValDescAcres,1);

      cout << "Abrindo comprovante e registrando item com desc/acresc ..."<< endl;
      Resposta =  ECF_AbreRecebimentoNaoFiscal(indice, TipoDescAcres, TipoValDescAcres, ValDescAcres, valor, "");
      Memo1.Lines.Add(string("ECF_AbreRecebimentoNaoFiscal - Resposta: ")+string(inttostr(Resposta)));
   }
   else	
   {
       cout << "Abrindo comprovante..."<< endl;
       Resposta = ECF_AbreRecebimentoNaoFiscalMFD("53.485.215/0001-06","S W E D A", "Rua Dona Brigida,713");
       Memo1.Lines.Add(string("ECF_AbreRecebimentoNaoFiscalMFD - Resposta: ")+string(inttostr(Resposta)));
       cout << "Erro " << dec << Resposta << endl;

       cout << "registasndo item sem desc/acresc..."<< endl;
       Resposta = ECF_EfetuaRecebimentoNaoFiscalMFD(indice,valor);
       Memo1.Lines.Add(string("ECF_EfetuaRecebimentoNaoFiscalMFD - Resposta: ")+string(inttostr(Resposta)));
       cout << "Erro " << dec << Resposta << endl;
   }

   do	
   {
   	GetTexto("Valor ou % do acrescimo/desconto de um item registrado: ",ValDescAcres,14);

   	if (ValDescAcres[0] != 0)
   	{ 
	   GetTexto("Digite 'A' se for acrescimo ou 'D' se for desconto: ",TipoDescAcres,1);

           GetTexto("Digite '$' se for valor ou '%' se for percentual: ",TipoValDescAcres,1);

           GetTexto("Numero do item: ",item,3);

	   Resposta = ECF_AcrescimoItemNaoFiscalMFD(item,TipoDescAcres,TipoValDescAcres,ValDescAcres);
   	   Memo1.Lines.Add(string("ECF_AcrescimoItemNaoFiscalMFD - Resposta: ")+string(inttostr(Resposta)));
	}

   	GetTexto("Digite o indice do totalizador ou zero para cancelar item: ",indice,2);

   	if (indice[0] == 0)
   	   break;

	if (indice[0] == '0' && (indice[1] <= ' ' || indice[1] == '0'))
	{
	   GetTexto("Digite o numero do item: ",item,3);

	   Resposta = ECF_CancelaItemNaoFiscalMFD(item);
   	   Memo1.Lines.Add(string("ECF_CancelaItemNaoFiscalMFD - Resposta: ")+string(inttostr(Resposta)));
	   Resposta = 1;
	   continue;
	}
   	
	GetTexto("Valor: ",valor,14);

        Resposta = ECF_EfetuaRecebimentoNaoFiscalMFD(indice,valor);
        Memo1.Lines.Add(string("ECF_EfetuaRecebimentoNaoFiscalMFD - Resposta: ")+string(inttostr(Resposta)));
	if (Resposta != 1)
	   cout << "Erro " << dec << Resposta << endl;
   }
   while (Resposta == 1);

   cout << "Encerrando o comprovante..."<< endl;

   GetTexto("Digite o Valor/percentual do acrescimo no   T O T A L: ",ValDescAcres,14);

   if (ValDescAcres[0] != 0)
   { 
       GetTexto("Digite '$' se for valor ou '%' se for percentual: ",TipoValDescAcres,1);

       Resposta = ECF_AcrescimoDescontoSubtotalRecebimentoMFD("A",TipoValDescAcres,ValDescAcres);
       Memo1.Lines.Add(string("ECF_AcrescimoDescontoSubtotalRecebimentoMFD - Resposta: ")+string(inttostr(Resposta)));
   }

   GetTexto("Digite o Valor/percentual do desconto no   T O T A L: ",ValDescAcres,14);

   if (ValDescAcres[0] != 0)
   { 
       GetTexto("Digite '$' se for valor ou '%' se for percentual: ",TipoValDescAcres,1);

       Resposta = ECF_AcrescimoDescontoSubtotalRecebimentoMFD("D",TipoValDescAcres,ValDescAcres);
       Memo1.Lines.Add(string("ECF_AcrescimoDescontoSubtotalRecebimentoMFD - Resposta: ")+string(inttostr(Resposta)));
   }

   GetTexto("Nome do meio de pagamento: ",nome,15);

   GetTexto("Valor: ",valor,14);

   GetTexto("Texto: ",buf,80);

   Resposta = ECF_TotalizaRecebimentoMFD();
   Memo1.Lines.Add(string("ECF_TotalizaRecebimentoMFD - Resposta: ")+string(inttostr(Resposta)));

   Resposta = ECF_EfetuaFormaPagamentoNaoFiscal(nome, valor, buf);
   Memo1.Lines.Add(string("ECF_EfetuaFormaPagamentoNaoFiscal - Resposta: ")+string(inttostr(Resposta)));

   if (Resposta > 0)
     MStatusECF ();
   else
     MRetornoECF();

   Resposta = ECF_FechaRecebimentoNaoFiscalMFD("O cliente sempre tem razão !!!");
   Memo1.Lines.Add(string("ECF_FechaRecebimentoNaoFiscalMFD - Resposta: ")+string(inttostr(Resposta)));

   if (Resposta > 0)
     MStatusECF ();
   else
     MRetornoECF();
   Pausa();
}

#ifndef WIN32
char *ARQUIVO_TEF = "TEF.TXT";
#else
char *ARQUIVO_TEF = "c:\\SWEDA\\TEF.TXT";
#endif
char Nome[16];
void EmitTEF()
{
   int  n;
   char Valor[15];	
   char cLinhas[1001];
   fstream inoutfile;
   string  buff;

   GetTexto("Nome do meio de pagamento registrado no documento: ",Nome,15);

   GetTexto("Valor: ",Valor,14);

   GetTexto("Digite informacao adicional para o comprovante: ",cLinhas,1000);

   if (cLinhas[0] == 0 || strlen(cLinhas) < 10)
   {
      cout << "Abrindo o arquivo " << ARQUIVO_TEF << endl;

      inoutfile.open (ARQUIVO_TEF, fstream::in);
      if (inoutfile.is_open())
      {
          if (inoutfile.good())
	  {
        	inoutfile.read(cLinhas,sizeof(cLinhas)-1);
		n = inoutfile.gcount();
		if (n < 0)
		   n = 0;
		cLinhas[n] = '\0';
	  }
          inoutfile.close();
      }
      else
      {
   	  Resposta= ECF_AbreComprovanteNaoFiscalVinculadoMFD(Nome, Valor, "", "", "", "");
          Memo1.Lines.Add(string("ECF_AbreComprovanteNaoFiscalVinculadoMFD - Resposta:  ")+string(inttostr(Resposta)));

	  sprintf(cLinhas,"%s NAO ENCONTRADO",ARQUIVO_TEF);
           	
          Resposta  = ECF_UsaComprovanteNaoFiscalVinculado(cLinhas);
          Memo1.Lines.Add(string("ECF_UsaComprovanteNaoFiscalVinculado - Resposta:  ")+string(inttostr(Resposta)));

	  Resposta= ECF_FechaComprovanteNaoFiscalVinculado();
   	  Memo1.Lines.Add(string("ECF_FechaComprovanteNaoFiscalVinculado - Resposta:  ")+string(inttostr(Resposta)));
   	  Memo1.Lines.Add("");
	  Pausa();
	  return;
      }	
   }
   else
   {
       cout << "Gravando texto no arquivo " << ARQUIVO_TEF << endl;
       inoutfile.open (ARQUIVO_TEF, fstream::out);
       inoutfile.write(cLinhas,strlen(cLinhas));	
       inoutfile.close();
   }

   cout << "Lendo o arquivo " << ARQUIVO_TEF << endl;
   Resposta = ECF_TEF_ImprimirRespostaCartao(ARQUIVO_TEF,Nome,"0",Valor);
   Memo1.Lines.Add(string("ECF_TEF_ImprimirRespostaCartao - Resposta: ")+string(inttostr(Resposta)));

   Resposta  = ECF_UsaComprovanteNaoFiscalVinculado("************ segunda via **********\n\n\n");
   Memo1.Lines.Add(string("ECF_UsaComprovanteNaoFiscalVinculado - Resposta:  ")+string(inttostr(Resposta)));

   Resposta  = ECF_UsaComprovanteNaoFiscalVinculado(cLinhas);
   Memo1.Lines.Add(string("ECF_UsaComprovanteNaoFiscalVinculado - Resposta:  ")+string(inttostr(Resposta)));

   Resposta= ECF_FechaComprovanteNaoFiscalVinculado();
   Memo1.Lines.Add(string("ECF_FechaComprovanteNaoFiscalVinculado - Resposta:  ")+string(inttostr(Resposta)));
   Memo1.Lines.Add("");
   Pausa();
}

void SegVia()
{
   Resposta =  ECF_SegundaViaNaoFiscalVinculadoMFD();
   Memo1.Lines.Add(string("ECF_SegundaViaNaoFiscalVinculadoMFD - Resposta:  ")+string(inttostr(Resposta)));
   Pausa();
}

void Reimpr()
{
   Resposta = ECF_ReimpressaoNaoFiscalVinculadoMFD();
   Memo1.Lines.Add(string("ECF_ReimpressaoNaoFiscalVinculado - Resposta: ")+string(inttostr(Resposta)));

   cout << "Lendo o arquivo " << ARQUIVO_TEF << endl;
   Resposta = ECF_TEF_EsperarArquivo(ARQUIVO_TEF,"60","0");
   Memo1.Lines.Add(string("ECF_TEF_EsperarArquivo - Resposta: ")+string(inttostr(Resposta)));

   if (Resposta == 1)
   {
	Resposta = ECF_TEF_ImprimirResposta(ARQUIVO_TEF,Nome, "0");
   	Memo1.Lines.Add(string("ECF_TEF_ImprimirResposta - Resposta: ")+string(inttostr(Resposta)));

  	Resposta= ECF_TEF_FechaRelatorio();
   	Memo1.Lines.Add(string("ECF_TEF_FechaRelatorio - Resposta: ")+string(inttostr(Resposta)));
   }
   else
      cout << "Arquivo  " << ARQUIVO_TEF << "nao encontrado ou TEF recusado! " << endl;
   Pausa();
}

void Estor()
{
   char cLinhas[1001];	

   GetTexto("Digite informacao adicional para o comprovante: ",cLinhas,1000);

   Resposta = ECF_EstornoNaoFiscalVinculadoMFD("","","");
   Memo1.Lines.Add(string("ECF_EstornoNaoFiscalVinculadoMFD - Resposta: ")+string(inttostr(Resposta)));

   Resposta  = ECF_UsaComprovanteNaoFiscalVinculado(cLinhas);
   Memo1.Lines.Add(string("ECF_UsaComprovanteNaoFiscalVinculado - Resposta:  ")+string(inttostr(Resposta)));

   Resposta= ECF_FechaComprovanteNaoFiscalVinculado();
   Memo1.Lines.Add(string("ECF_FechaComprovanteNaoFiscalVinculado - Resposta:  ")+string(inttostr(Resposta)));
   Pausa();
}

void RGTEF()
{
   Resposta = ECF_RelatorioGerencialTEF("Imprime texto TEF, usando funcao de Relatorio Gerencial\n"); 
   Memo1.Lines.Add(string("ECF_RelatorioGerencialTEF - Resposta:  ")+string(inttostr(Resposta)));

   Resposta = ECF_RelatorioGerencialTEF("Esta e' a segunda parte do texto"); 
   Memo1.Lines.Add(string("ECF_RelatorioGerencialTEF - Resposta:  ")+string(inttostr(Resposta)));

   Resposta = ECF_RelatorioGerencialTEF("Esta e' a terceira parte do texto"); 
   Memo1.Lines.Add(string("ECF_RelatorioGerencialTEF - Resposta:  ")+string(inttostr(Resposta)));

   Resposta= ECF_FechaComprovanteNaoFiscalVinculado();
   Memo1.Lines.Add(string("ECF_FechaComprovanteNaoFiscalVinculado - Resposta:  ")+string(inttostr(Resposta)));
   Pausa();
}

void CancDoc()
{
  Resposta = ECF_CancelaCupomMFD("","", "");
  Memo1.Lines.Add(string("ECF_CancelaCupomMFD - Resposta: ")+string(inttostr(Resposta)));
  Pausa();
}

void SuprirCaixa()
{
  char  cValor[15];
  char  cFormaPgto[20];

  GetTexto("Valor: ",cValor,14);
  if (cValor[0] == 0)
      return;	
  GetTexto("Nome do meio de pagamento: ",cFormaPgto,15);

  Resposta = ECF_Suprimento(cValor, cFormaPgto);
  Memo1.Lines.Add(string("ECF_Suprimento - Resposta: ")+string(inttostr(Resposta)));
  Pausa();
}

void RetiradaCaixa()
{
  char cValor[15];

  GetTexto("Valor: ",cValor,14);
  if (cValor[0] == 0)
      return;	
  Resposta = ECF_Sangria(cValor);
  Memo1.Lines.Add(string("ECF_Sangria - Resposta: ")+string(inttostr(Resposta)));
  Pausa();
}

void RelatorioGerencial()
{
    bool barras;
    int  nivel,altura,largura,coluna;
    char Codigo[1001];
    char cLinhas[300];
    Resposta=0;
    Resposta= ECF_AbreRelatorioGerencial();

    barras =  (MessageQ("Imprime Codigo 2D PDF (s/n) ?","Questao")==Y);
    if (barras == true)
    {
       cout << "Nivel de erro (0 a 8) :";
       cin >> nivel;
       cout << endl;
       cout << "Altura (1 a 8): ";
       cin >> altura;
       cout << endl;
       cout << "Largura (1 a 4) : ";
       cin >> largura;
       cout << endl;
       cout << "Coluna (0 a 30) : ";
       cin >> coluna;
       cout << endl;
       GetTexto("Codigo a ser impresso: ",Codigo,1000);
    }

    Memo1.Lines.Add(string("ECF_AbreRelatorioGerencial - Resposta: ")+string(inttostr(Resposta)));
    memset(cLinhas,0,300);

    if (barras == true)
    {
       Resposta =  ECF_CodigoBarrasPDF417MFD(nivel,altura,largura,coluna,Codigo);
       Memo1.Lines.Add(string("ECF_CodigoBarrasPDF417MFD - Resposta: ")+string(inttostr(Resposta)));
    }

    if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();

    GetTexto("Digite o texto do comprovante): ",cLinhas,300);
    if (cLinhas[0] == 0)
	return;
 
    Resposta= ECF_UsaComprovanteNaoFiscalVinculadoTEF(cLinhas);
    Memo1.Lines.Add(string("ECF_UsaComprovanteNaoFiscalVinculadoTEF - Resposta:  ")+string(inttostr(Resposta)));

    if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();


     Memo1.Lines.Add(string("Impressao de texto:")+string(inttostr(Resposta)));
     Resposta= ECF_FechaRelatorioGerencial();
     Memo1.Lines.Add(string("ECF_FechaRelatorioGerencial - Resposta: ")+string(inttostr(Resposta)));
     Memo1.Lines.Add("");

    if (Resposta > 0)
     MStatusECF ();
    else
     MRetornoECF();
   Pausa();
}

void RelatorioGerencial2()
{
    bool  barras;
    char  opcao;	
    int   altura,largura,posicao,fonte,margem; 
    char  indice[3];
    char  Codigo[40];
    char  Texto[]="Relatorio gerencial automatico...\nMensagem1\nMensagem2\nFinal."; 

    barras =  (MessageQ("Imprime Codigo de Barras (s/n) ?","Questao")==Y);
    if (barras == true)
    {
       cout << "0= sair 1= CODABAR 2=CODE39 3=EAN13 4=EAN8 5=ITF 6=UPCA 7=UPCE";
       cin >> opcao;
       cout << endl;
       if (opcao == '0')
       {
	   Pausa();
	   return;	
       }
       cout << "Altura (1 a 255 -  padrao 162) :";
       cin >> altura;
       cout << endl;
       cout << "Largura (0=fina 1=media 2=grossa):";
       cin >> largura;
       cout << endl;
       cout << "Posicao (0=nao 1=acima do codigo 2=abaixo 3=acima e abaixo) :";
       cin >> posicao;
       cout << endl;
       cout << "Fonte (0= normal 1= condensado) :";
       cin >> fonte;
       cout << endl;
       cout << "Margem (0 e 575 dots pitch) :";
       cin >> margem;
       cout << endl;
       GetTexto("Codigo a ser impresso: ",Codigo,39);
    }

    GetTexto("Digite o indice do totalizador: ",indice,2);
    if (indice[0] != 0)
    {
    	Resposta =  ECF_AbreRelatorioGerencialMFD(indice);
  	Memo1.Lines.Add(string("ECF_AbreRelatorioGerencialMFD - Resposta: ")+string(inttostr(Resposta)));
    }

    Resposta = ECF_RelatorioGerencial(Texto);
    Memo1.Lines.Add(string("ECF_RelatorioGerencial - Resposta: ")+string(inttostr(Resposta)));

    Resposta = ECF_EnviarTextoCNF("segundo bloco de dados do relatorio");
    Memo1.Lines.Add(string("ECF_EnviarTextoCNF - Resposta: ")+string(inttostr(Resposta)));

    if (barras == true)
    {
	switch (opcao)
	{
	case '1':
       	Resposta = ECF_ConfiguraCodigoBarrasMFD(altura,largura,posicao,fonte,margem);
       	Memo1.Lines.Add(string("ECF_ConfiguraCodigoBarrasMFD - Resposta: ")+string(inttostr(Resposta)));
	break;
	case '2':
	Resposta = ECF_CodigoBarrasCODABARMFD(Codigo);
       	Memo1.Lines.Add(string("ECF_CodigoBarrasCODABARMFD - Resposta: ")+string(inttostr(Resposta)));
	break;
	case '3':
       	Resposta = ECF_CodigoBarrasCODE39MFD(Codigo);
       	Memo1.Lines.Add(string("ECF_CodigoBarrasCODE39MFD - Resposta: ")+string(inttostr(Resposta)));
	break;
	case '4':
       	Resposta = ECF_CodigoBarrasEAN13MFD(Codigo);
       	Memo1.Lines.Add(string("ECF_CodigoBarrasEAN13MFD - Resposta: ")+string(inttostr(Resposta)));
	break;
	case '5':
	Resposta = ECF_CodigoBarrasEAN8MFD(Codigo);
       	Memo1.Lines.Add(string("ECF_CodigoBarrasEAN8MFD - Resposta: ")+string(inttostr(Resposta)));
	break;
	case '6':
	Resposta = ECF_CodigoBarrasITFMFD(Codigo);
       	Memo1.Lines.Add(string("ECF_CodigoBarrasITFMFD - Resposta: ")+string(inttostr(Resposta)));
	break;
	case '7':
	Resposta = ECF_CodigoBarrasUPCAMFD(Codigo);
       	Memo1.Lines.Add(string("ECF_CodigoBarrasUPCAMFD - Resposta: ")+string(inttostr(Resposta)));
	break;
	case '8':
	Resposta = ECF_CodigoBarrasUPCEMFD(Codigo);
       	Memo1.Lines.Add(string("ECF_CodigoBarrasUPCEMFD - Resposta: ")+string(inttostr(Resposta)));
	break;
	}
    }
    Resposta = ECF_UsaRelatorioGerencialMFD("segunda linha de dados do relatorio");
    Memo1.Lines.Add(string("ECF_UsaRelatorioGerencialMFD - Resposta: ")+string(inttostr(Resposta)));

    Resposta = ECF_UsaRelatorioGerencialMFDTEF("terceira linha");
    Memo1.Lines.Add(string("ECF_UsaRelatorioGerencialMFDTEF - Resposta: ")+string(inttostr(Resposta)));

    Resposta = ECF_FechaRelatorioXouZ();
    Memo1.Lines.Add(string("ECF_FechaRelatorioXouZ- Resposta: ")+string(inttostr(Resposta)));
    Pausa();
}

void lmf()
{ 
   char crzi[7];
   char crzf[7];
   char datai[12];
   char dataf[12];

   GetTexto("CRZ inicial: ",crzi,6);

   if (crzi[0] != 0)
   {
        GetTexto("CRZ final: ",crzf,6);
        Resposta = ECF_LeituraMemoriaFiscalReducaoMFD(crzi, crzf, "S");
        Memo1.Lines.Add(string("ECF_LeituraMemoriaFiscalReducao - Resposta:  ")+string(inttostr(Resposta)));
        Resposta = ECF_LeituraMemoriaFiscalReducaoMFD(crzi, crzf, "C");
        Memo1.Lines.Add(string("ECF_LeituraMemoriaFiscalReducao - Resposta:  ")+string(inttostr(Resposta)));
   }

   GetTexto("Data inicial: ",datai,10);

   if (datai[0] != 0)
   {
       GetTexto("Data final: ",dataf,10);
       Resposta = ECF_LeituraMemoriaFiscalDataMFD(datai,dataf,"S");
       Memo1.Lines.Add(string("ECF_LeituraMemoriaFiscalData - Resposta: ")+string(inttostr(Resposta)));
       Resposta = ECF_LeituraMemoriaFiscalDataMFD(datai,dataf,"C");
       Memo1.Lines.Add(string("ECF_LeituraMemoriaFiscalData - Resposta: ")+string(inttostr(Resposta)));
   }
   Pausa();
}

void ImprimirCheque()
{ 
  unsigned int Resposta=0,anterior=0;
  char cCodigoBanco[6]="237";
  char cValor[8]="132,25";
  char cFavorecido[250]="Irmaos Russi - LTDA";
  char cCidade[25]="Itupeva";
  char cData[15]="29/02/2008";
  char cMsg[250]="Mensagem inserida";
  char cVerso[2]="0";
  char cDiv[4]="\0";
  char Moeda[15]="Real";
  char Moedas[15]="Reais";

  Resposta = ECF_ProgramaMoedaSingular(Moeda);
  Resposta = ECF_ProgramaMoedaPlural(Moedas);
  Memo1.Lines.Add(string("ECF_ProgramaMoedaPlural - Resposta: ")+string(inttostr(Resposta)));
  Resposta = ECF_ImprimeChequeMFD  (cCodigoBanco,cValor,cFavorecido,cCidade,cData,cMsg,cVerso,cDiv);
  Memo1.Lines.Add(string("ECF_ImprimeChequeMFD - Resposta: ")+string(inttostr(Resposta)));
  while (Resposta!=1)
         { Resposta = ECF_VerificaStatusCheque(&Resposta);
            if (Resposta == -30)
            {
               cout << "ECF nao possui mecanismo de cheque" << endl; 
               break; 
            }
            if (Resposta <= 0)
            {
               cout << "ECF off line" << endl; 
               break; 
            }
            if (anterior != Resposta)
		{ anterior=Resposta;
		  switch(Resposta)
                        {
				case 2: cout<<"Cheque em impressao... "<<endl;
					break;
				case 3: cout<<"Cheque posicionado..."<<endl;
					break;
				case 4: cout<<"Aguardando posicionamento do cheque..."<<endl;
					break;
			}
		}
         }
 Pausa();
}

void Autentica()
{
  CupomFiscal();
  Resposta = ECF_Autenticacao();
  Memo1.Lines.Add(string("ECF_Autenticacao - Resposta: ")+string(inttostr(Resposta)));
  cout << "Aguardando a colocacao do documento para autenticar" << endl; 
  do  
  {
     Resposta = ECF_VerificaDocAutenticacao();
     Memo1.Lines.Add(string("ECF_Autenticacao - Resposta: ")+string(inttostr(Resposta)));
  }
  while  (Resposta == 0);

  Pausa();
}

void EstorPG()
{
   char origem[16];
   char destino[16];
   char valor[15];

   GetTexto("Nome do meio de pagamento a ser estornado: ",origem,15);
   if (origem[0] == 0)
       return;
   GetTexto("Nome do meio de pagamento a ser creditado: ",destino,15);
   GetTexto("valor registrado no cupom fiscal/comprovante encerrado: ",valor,14);

   Resposta = ECF_EstornoFormasPagamento(origem,destino,valor);
   Memo1.Lines.Add(string("ECF_EstornoFormasPagamento - Resposta: ")+string(inttostr(Resposta)));
   Pausa();
}

void LeituraX()
{   int Resposta;
    Resposta = ECF_LeituraX();
    Memo1.Lines.Add("");
    Memo1.Lines.Add(string("ECF_LeituraX - Resposta: ")+string(inttostr(Resposta)));
    Memo1.Lines.Add("");
    Pausa();
}

void ReducaoZ()
{  char cDatai[15],cHorai[15];
   int ret;

   if (MessageQ("Entra com a data e a hora do computador (s/n) ? ","Sistema") == Y)
   {
      LeDataSistema(cDatai);
      cout<<"Data: "<<cDatai<<endl;
      LeHoraSistema(cHorai);
      cout<<"Hora: "<<cHorai<<endl;
   }
   else
   {
      GetTexto("Data: ", cDatai,10);	
      GetTexto("Hora: ", cHorai,8);	
   } 
   if (MessageQ("Tem certeza que deseja fechar o caixa (s/n) ?","Sistema") == Y)
   {
   	ret=ECF_ReducaoZ(cDatai,cHorai);
   	Memo1.Lines.Add(string("ECF_ReducaoZ - Resposta: ")+string(inttostr(ret)));
   }
   Pausa();
}

void LstParam()
{
    Resposta = ECF_ImprimeConfiguracoesImpressora();
    Memo1.Lines.Add(string("ECF_ImprimeConfiguracoesImpressora - Resposta: ")+string(inttostr(Resposta)));
    Pausa();
}

void FecDia()
{
    if (MessageQ("Deseja efetuar o fechamento do dia (s/n) ?", "Questao")==Y)
    {
        Resposta = ECF_FechamentoDoDia();
        Memo1.Lines.Add(string("ECF_FechamentoDoDia - Resposta: ")+string(inttostr(Resposta)));
    }
    Pausa();
}

//		*********************************************************
//		*							*
//		*							*
//		*	  LEITURA DA MEMORIA DE TRABALHO DO ECF		*				//		*							*
//		*							*
//		*********************************************************

bool Mensagem = false;

void InformProg()
{
   char texto[3100],texto2[200];

   cout << endl << endl << " ----------------- P R O G R A M A C A O ------------------------" << endl;

   Resposta = ECF_RetornaPortaVelocidade(texto,texto2);

   cout << "CF_RetornaPortaVelocidade - Resposta: "  << dec << Resposta << endl;
   reportar("Porta Serial: ",texto);
   reportar("Velocidade:  ",texto2);

   Resposta = ECF_VersaoDll(texto);	
   cout << "ECF_VersaoDll - Resposta: " << dec << Resposta << endl;
   reportar("Versao da Bibioteca: ",texto);

   Resposta = ECF_RetornaTipoEcf(texto);	
   cout << "ECF_RetornaTipoEcf - Resposta: " << dec << Resposta << endl;
   reportar("Tipo de ECF: ",texto);

   Resposta = ECF_VersaoFirmware(texto);
   cout << "ECF_VersaoFirmware - Resposta: " << dec << Resposta << endl;
   reportar("Firmware versao: ",texto);

   Resposta = ECF_MarcaModeloTipoImpressoraMFD(texto,texto+40,texto+80);	
   cout << "ECF_MarcaModeloTipoImpressoraMFD - Resposta: " << dec << Resposta << endl;
   reportar("Marca  do ECF: ",texto);
   reportar("Modelo do ECF: ",texto+40);
   reportar("Tipo   do ECF: ",texto+80);

   Resposta = ECF_NumeroSerieMFD(texto);
   cout << "ECF_NumeroSerieMFD - Resposta: " << dec << Resposta << endl;
   reportar("Numero de Serie da MFD: ",texto);

   Resposta = ECF_NumeroSerieMemoriaMFD(texto);	
   cout << "ECF_NumeroSerieMemoriaMFD - Resposta: " << dec << Resposta << endl;
   reportar("Numero de Serie MFD do ECF: ",texto);

   Resposta = ECF_VerificaModoOperacao(texto);	
   cout << "ECF_VerificaModoOperacao - Resposta: " << dec << Resposta << endl;
   reportar("Modo de Operacao: ",texto);

   Resposta = ECF_CNPJMFD(texto);	
   cout << "ECF_CNPJMFD - Resposta: " << dec << Resposta << endl;
   reportar("C N P J: ",texto);

   Resposta = ECF_InscricaoEstadualMFD(texto);	
   cout << "ECF_InscricaoEstadualMFD - Resposta: " << dec << Resposta << endl;
   reportar("Inscricao Estadual: ",texto);

   Resposta = ECF_InscricaoMunicipalMFD(texto);	
   cout << "ECF_InscricaoMunicipalMFD - Resposta: " << dec << Resposta << endl;
   reportar("Inscricao Municipal: ",texto);

   Resposta = ECF_ClicheProprietario(texto);	
   cout << "ECF_ClicheProprietario - Resposta: " << dec << Resposta << endl;
   reportar("Cabecalho: ",texto);

   Resposta = ECF_ClicheProprietarioEx(texto);	
   cout << "ECF_ClicheProprietarioEx - Resposta: " << dec << Resposta << endl;
   reportar("CabecalhoEx: ",texto);

   Resposta = ECF_NumeroLoja(texto);
   cout << "ECF_NumeroLoja - Resposta: " << dec << Resposta << endl;	
   reportar("Numero da loja: ",texto);

   Resposta = ECF_NumeroCaixa(texto);	
   cout << "ECF_NumeroCaixa - Resposta: " << dec << Resposta << endl;
   reportar("Numero da Caixa: ",texto);

   Resposta = ECF_DataHoraImpressora(texto, texto2);	
   cout << "ECF_DataHoraImpressora - Resposta: " << dec << Resposta << endl;
   reportar("Data: ",texto);
   reportar("Hora: ",texto2);

   Resposta = ECF_RetornoAliquotas(texto);
   cout << "ECF_RetornoAliquotas - Resposta: " << dec << Resposta << endl;
   reportar("Aliquotas: ",texto,',');

   Resposta = ECF_LerAliquotasComIndice(texto);
   cout << "ECF_LerAliquotasComIndice - Resposta: " << dec << Resposta << endl;
   reportar("Aliquotas com indice: ",texto,',');

   Resposta = ECF_VerificaAliquotasIss(texto);
   cout << "ECF_VerificaAliquotasIss - Resposta: " << dec << Resposta << endl;
   reportar("Aliquotas ISS: ",texto,',');

   Resposta = ECF_VerificaIndiceAliquotasIss(texto);
   cout << "ECF_VerificaIndiceAliquotasIss - Resposta: " << dec << Resposta << endl;
   reportar("Aliquotas ISS: ",texto,',');

   Resposta = ECF_VerificaTruncamento(texto);
   cout << "ECF_VerificaTruncamento - Resposta: " << dec << Resposta << endl;
   reportar("Flag de truncamento: ",texto);

   Resposta = ECF_VerificaTotalizadoresNaoFiscais(texto);
   cout << "ECF_VerificaTotalizadoresNaoFiscais - Resposta: " << dec << Resposta << endl;
   reportar("Totalizadores Nao Fiscais: ",texto,',');

   Resposta = ECF_VerificaTotalizadoresNaoFiscaisMFD(texto);
   cout << "ECF_VerificaTotalizadoresNaoFiscaisMFD - Resposta: " << dec << Resposta << endl;
   reportar("Totalizadores Nao Fiscais MFD: ",texto,',');

   Resposta = ECF_VerificaDescricaoFormasPagamento(texto);
   cout << "ECF_VerificaDescricaoFormasPagamento - Resposta: " << dec << Resposta << endl;
   reportar("Descricao dos meios de pagamento: ",texto,',');

   Resposta = ECF_VerificaTotalizadoresNaoFiscaisEx(texto);
   cout << "ECF_VerificaTotalizadoresNaoFiscaisEx - Resposta: " << dec << Resposta << endl;
   reportar("Totalizadores nao fiscais Ex: ",texto,',');

   Resposta = ECF_VerificaRelatorioGerencialProgMFD(texto);
   cout << "ECF_VerificaRelatorioGerencialProgMFD - Resposta: " << dec << Resposta << endl;
   reportar("Descricao dos titulos de relatorio gerencial: ",texto,',');

   Resposta = ECF_CasasDecimaisProgramada(texto,texto2);
   cout << "ECF_CasasDecimaisProgramada - Resposta: " << dec << Resposta << endl;
   reportar("Casas decimais do preco: ",texto);

   Resposta = ECF_DataHoraGravacaoUsuarioSWBasicoMFAdicional(texto,texto+20,texto+40);
   cout << "ECF_DataHoraGravacaoUsuarioSWBasicoMFAdicional - Resposta: " << dec << Resposta << endl;
   reportar("Data do usuario atual: ",texto);
   reportar("Data do software basico: ",texto+20);
   reportar("MF adicional: ",texto+40);

   Resposta = ECF_CodigoModeloFiscal(texto, texto2);
   cout << "ECF_CodigoModeloFiscal -  Resposta: " << dec << Resposta << endl;
   reportar("CNIEE: ",texto);
   reportar("complemento: ",texto2);

   if (Mensagem == true) 	
      cout <<endl<<endl<<"**************** Confira os dados exibidos - <<< 1/9 >>>."<< endl;	
   Pausa(true);
#ifndef WIN32
   cout<<"\x1B[2J"<<endl;
#endif
}

void InformUltimoDoc()
{
   char texto[3100],texto2[200];

   cout << endl << endl << " ---------------VALORES DO ULTIMO DOCUMENTO ---------------------" << endl;
   Resposta = ECF_TipoUltimoDocumento(texto);
   cout << "ECF_TipoUltimoDocumento - Resposta: " << dec << Resposta << endl;
   reportar("Tipo Ultimo Documento: ",texto);

   Resposta = ECF_UltimoItemVendido(texto);
   cout << "ECF_UltimoItemVendido - Resposta: " << dec << Resposta << endl;
   reportar("Ultimo item vendido: ",texto);

   Resposta = ECF_SubTotal(texto);
   cout << "ECF_SubTotal - Resposta: " << dec << Resposta << endl;
   reportar("Subtotal da venda: ",texto);

   Resposta = ECF_SubTotalComprovanteNaoFiscalMFD(texto);
   cout << "ECF_SubTotalComprovanteNaoFiscalMFD - Resposta: " << dec << Resposta << endl;
   reportar("Subtotal da comprovante: ",texto);

   Resposta = ECF_ValorPagoUltimoCupom(texto);
   cout << "ECF_ValorPagoUltimoCupom - Resposta: " << dec << Resposta << endl;
   reportar("Valor pago ultimo cupom: ",texto);

   Resposta = ECF_NumeroCupom(texto);
   cout << "ECF_NumeroCupom - Resposta: " << dec << Resposta << endl;
   reportar("Numero do cupom:",texto);

   Resposta = ECF_VerificaFormasPagamento(texto);
   cout << "ECF_VerificaFormasPagamento - Resposta: " << dec << Resposta << endl;
   reportar("Formas de pagamento: ",texto,',');

   Resposta = ECF_VerificaFormasPagamentoMFD(texto);
   cout << "ECF_VerificaFormasPagamentoMFD - Resposta: " << dec << Resposta << endl;
   reportar("Formas de pagamento MFD: ",texto,',');

   Resposta = ECF_UltimaFormaPagamento(texto,texto2);
   cout << "ECF_UltimaFormaPagamento - Resposta: " << dec << Resposta << endl;
   reportar("nome do ultimo meio de pagamento:",texto);
   reportar("valor do ultimo meio de pagamento:",texto2);

   Resposta = ECF_VerificaFormasPagamentoEx(texto);
   cout << "ECF_VerificaFormasPagamentoEx - Resposta: " << dec << Resposta << endl;
   reportar("Formas de pagamento Ex: ",texto,',');

   Resposta = ECF_TotaisVenda(texto);
   cout << "ECF_TotaisVenda - Resposta: " << dec << Resposta << endl;
   reportar("Totais fiscais da venda: ",texto,',');

   Resposta = ECF_ValorAcrescimosUltimoCupom(texto);
   cout << "ECF_ValorAcrescimosUltimoCupom - Resposta: " << dec << Resposta << endl;
   reportar("Acrescimo ICMS do ultimo cupom: ",texto);

   Resposta = ECF_ValorDescontosUltimoCupom(texto);
   cout << "ECF_ValorDescontosUltimoCupom - Resposta: " << dec << Resposta << endl;
   reportar("Desconto ICMS do ultimo cupom: ",texto);

   Resposta = ECF_ValorCancelamentosUltimoCupom(texto);
   cout << "ECF_ValorCancelamentosUltimoCupom - Resposta: " << dec << Resposta << endl;
   reportar("Cancelamento ICMS do ultimo cupom: ",texto);

   Resposta = ECF_ValorCancelamentosUltimoCupomISS(texto);
   cout << "ECF_ValorCancelamentosUltimoCupomISS - Resposta: " << dec << Resposta << endl;
   reportar("Cancelamento ISS do ultimo cupom: ",texto);

   Resposta = ECF_ValorAliquotaUltimoCupom(texto);
   cout << "ECF_ValorAliquotaUltimoCupom - Resposta: " << dec << Resposta << endl;
   reportar("Impostos do ultimo cupom: ",texto);

   if (Mensagem == true)
      cout <<endl<<endl<<"**************** Confira os dados exibidos - <<< 2/9 >>>."<< endl;	
   Pausa(true);
#ifndef WIN32
   cout<<"\x1B[2J"<<endl;
#endif
}

void    InformAcumDiarios()
{
   char texto[3100],texto2[200];

   cout << endl << endl << " ----------------- ACUMULADORES   DIARIOS ------------------------" << endl << endl;
   Resposta = ECF_Acrescimos(texto);
   cout << "ECF_Acrescimos - Resposta: " << dec << Resposta << endl;
   reportar("Total de acrescmos ICMS: ",texto);

   Resposta = ECF_Descontos(texto);
   cout << "ECF_Descontos - Resposta: " << dec << Resposta << endl;
   reportar("Total de descontos ICMS:",texto);

   Resposta = ECF_VerificaRecebimentoNaoFiscal(texto);
   cout << "ECF_VerificaRecebimentoNaoFiscal - Resposta: " << dec << Resposta << endl;
   reportar("Recebimentos nao fiscais: ",texto,',');

   Resposta = ECF_VerificaRecebimentoNaoFiscalMFD(texto);
   cout << "ECF_VerificaRecebimentoNaoFiscalMFD - Resposta: " << dec << Resposta << endl;
   reportar("Recebimentos nao fiscais MFD: ",texto,',');

   Resposta = ECF_Cancelamentos(texto);
   cout << "ECF_Cancelamentos - Resposta: " << dec << Resposta << endl;
   reportar("Total de cancelamentos ICMS:",texto);

   Resposta = ECF_GrandeTotal(texto);
   cout << "ECF_GrandeTotal - Resposta: " << dec << Resposta << endl;
   reportar("Grande total: ",texto);

   Resposta = ECF_VerificaTotalizadoresParciais(texto);
   cout << "ECF_VerificaTotalizadoresParciais - Resposta: " << dec << Resposta << endl;
   reportar("Totalizadores parciais: ",texto,',');

   Resposta = ECF_VerificaTotalizadoresParciaisMFD(texto);
   cout << "ECF_VerificaTotalizadoresParciaisMFD - Resposta: " << dec << Resposta << endl;
   reportar("Totalizadores parciais MFD: ",texto,',');

   Resposta = ECF_VendaBruta(texto);
   cout << "ECF_VendaBruta - Resposta: " << dec << Resposta << endl;
   reportar("Venda bruta: ",texto);

   Resposta = ECF_RetornaAcrescimoNF(texto);
   cout << "ECF_RetornaAcrescimoNF - Resposta: " << dec << Resposta << endl;
   reportar("Acrescimo nao fiscal: ",texto);

   Resposta = ECF_RetornaDescontoNF(texto);
   cout << "ECF_RetornaDescontoNF - Resposta: " << dec << Resposta << endl;
   reportar("Desconto nao fiscal: ",texto);

   Resposta = ECF_RetornaCancelamentoNF(texto);
   cout << "ECF_RetornaCancelamentoNF - Resposta: " << dec << Resposta << endl;
   reportar("Cancelamento nao fiscal: ",texto);

   Resposta = ECF_RetornaTotalPagamentos(texto);
   cout << "ECF_RetornaTotalPagamentos - Resposta: " << dec << Resposta << endl;
   reportar("Totais dos meios de pagamento: ",texto,',');

   Resposta = ECF_RetornaCNFNV(texto);
   cout << "ECF_RetornaCNFNV - Resposta: " << dec << Resposta << endl;
   reportar("Totais nao fiscais: ",texto,',');

   Resposta = ECF_RetornaTroco(texto);
   cout << "ECF_RetornaTroco - Resposta: " << dec << Resposta << endl;
   reportar("Troco: ",texto);

   Resposta = ECF_RetornaRegistradoresNaoFiscais(texto);
   cout << "ECF_RetornaRegistradoresNaoFiscais - Resposta: " << dec << Resposta << endl;
   reportar("Contadores e acumuladore nao fiscais: ",texto,',');

   Resposta = ECF_RetornaRegistradoresFiscais(texto);
   cout << "ECF_RetornaRegistradoresFiscais - Resposta: " << dec << Resposta << endl;
   reportar("Contadores e acumuladore fiscais: ",texto,',');

   Resposta = ECF_AcrescimosICMSISS(texto,texto2);
   cout << "ECF_AcrescimosICMSISS - Resposta: " << dec << Resposta << endl;
   reportar("Acrescimo ICMS do dia:",texto);
   reportar("Acrescimo ISS  do dia:",texto2);

   Resposta = ECF_CancelamentosICMSISS(texto,texto2);
   cout << "ECF_CancelamentosICMSISS - Resposta: " << dec << Resposta << endl;
   reportar("Cancelamento ICMS do dia:",texto);
   reportar("Cancelamento ISS  do dia:",texto2);

   Resposta = ECF_DescontosICMSISS(texto,texto2);
   cout << "ECF_DescontosICMSISS - Resposta: " << dec << Resposta << endl;
   reportar("Desconto ICMS do dia:",texto);
   reportar("Desconto ISS  do dia:",texto2);

   if (Mensagem == true) 
       cout <<endl<<endl<<"**************** Confira os dados exibidos - <<< 3/9 >>>."<< endl;	
   Pausa(true);
#ifndef WIN32
   cout<<"\x1B[2J"<<endl;
#endif
}

void InformContadoresDiarios()
{
   char texto[3100],texto2[200];

   cout << endl << endl << " ----------------- C O N T A D O R E S ------------------------" << endl;
   Resposta = ECF_NumeroCupom(texto);
   cout << "ECF_NumeroCupom - Resposta: " << dec << Resposta << endl;
   reportar("Numero do cupom: ",texto);


   Resposta = ECF_NumeroIntervencoes(texto);
   cout << "ECF_NumeroIntervencoes - Resposta: " << dec << Resposta << endl;
   reportar("Numero de intervencoes:",texto);

   Resposta = ECF_ContadorCupomFiscalMFD(texto);
   cout << "ECF_ContadorCupomFiscalMFD - Resposta: " << dec << Resposta << endl;
   reportar("Numero de cupons fiscais emitidos:",texto);

   Resposta = ECF_NumeroCuponsCancelados(texto);
   cout << "ECF_NumeroCuponsCancelados - Resposta: " << dec << Resposta << endl;
   reportar("Numero de cupons fiscais cancelados:",texto);

   Resposta = ECF_NumeroOperacoesNaoFiscais(texto);
   cout << "ECF_NumeroOperacoesNaoFiscais - Resposta: " << dec << Resposta << endl;
   reportar("Numero de cupons nao fiscais:",texto);

   Resposta = ECF_ContadorComprovantesCreditoMFD(texto);
   cout << "ECF_ContadorComprovantesCreditoMFD - Resposta: " << dec << Resposta << endl;
   reportar("Numero de CDCs:",texto);

   Resposta = ECF_ComprovantesNaoFiscaisNaoEmitidosMFD(texto);
   cout << "ECF_ComprovantesNaoFiscaisNaoEmitidosMFD - Resposta: " << dec << Resposta << endl;
   reportar("Numero de CNFs:",texto);

   Resposta = ECF_ContadorOperacoesNaoFiscaisCanceladasMFD(texto);
   cout << "ECF_ContadorOperacoesNaoFiscaisCanceladasMFD - Resposta: " << dec << Resposta << endl;
   reportar("Numero de CNFs cancelados:",texto);

   Resposta = ECF_ContadorFitaDetalheMFD(texto);
   cout << "ECF_ContadorFitaDetalheMFD - Resposta: " << dec << Resposta << endl;
   reportar("Numero de Fitas Detalhe impresso em MIT:",texto);

   Resposta = ECF_ContadorRelatoriosGerenciaisMFD(texto);
   cout << "ECF_ContadorRelatoriosGerenciaisMFD - Resposta: " << dec << Resposta << endl;
   reportar("Numero de Relatorios Gerenciais emitidos:",texto);

   Resposta = ECF_NumeroReducoes(texto);
   cout << "ECF_NumeroReducoes - Resposta: " << dec << Resposta << endl;
   reportar("Numero de reducoes:",texto);

   Resposta = ECF_RetornaCOO(texto);
   cout << "ECF_RetornaCOO - Resposta: " << dec << Resposta << endl;
   reportar("Numero do COO:",texto);

   Resposta = ECF_COO(texto, texto2);
   cout << "ECF_COO - Resposta: " << dec << Resposta << endl;
   reportar("Numero do COO inicial:",texto);
   reportar("Numero do COO final:",texto2);

   Resposta = ECF_ContadoresTotalizadoresNaoFiscais(texto);
   cout << "ECF_ContadoresTotalizadoresNaoFiscais - Resposta: " << dec << Resposta << endl;
   reportar("Contadores de acumuladore nao fiscais: ",texto,',');

   Resposta = ECF_ContadoresTotalizadoresNaoFiscaisMFD(texto);
   cout << "ECF_ContadoresTotalizadoresNaoFiscaisMFD - Resposta: " << dec << Resposta << endl;
   reportar("Contadores de acumuladore nao fiscais MFD: ",texto,',');

   Resposta = ECF_VerificaRelatorioGerencialMFD(texto);
   cout << "ECF_VerificaRelatorioGerencialMFD - Resposta: " << dec << Resposta << endl;
   reportar("Contador e nome dos titulos de relat. gerencial: ",texto,',');

   if (Mensagem == true)
      cout <<endl<<endl<<"**************** Confira os dados exibidos - <<< 4/9 >>>."<< endl;	
   Pausa(true);
#ifndef WIN32
   cout<<"\x1B[2J"<<endl;
#endif
}

void InformStatus()
{
   char texto[128];
   unsigned int flag, iAck, iSt1, iSt2, iSt3, iGav;
   char sGav[4];

   cout << endl << endl << " ---------------- S T A T U S      E C F ---------------------" << endl;
   Resposta = ECF_FlagsFiscais(&flag);
   cout << "ECF_FlagsFiscais - Resposta: " << dec << Resposta << endl;
   cout << "Flag Fiscal: " << hex << flag << endl;
   
   if (flag & 0x01)
	cout << "Cupom Fiscal Aberto"<< endl;
   if (flag & 0x02)
	cout << "Aguardando meio de pagamento..." << endl;
   if (flag & 0x04)
	cout << "Estamos no verao !!!!"<< endl;
   if (flag & 0x08)
	cout << "Houve reducao no dia"<< endl;
   if (flag & 0x20)
	cout << "Pode cancelar cupom fiscal"<< endl;
   if (flag & 0x80)
	cout << "Memoria Fiscal sem espaco !!!???@@@";
   cout << endl;

   Resposta = ECF_FlagsFiscaisStr(texto);
   cout << "ECF_FlagsFiscaisStr - Resposta: " << dec << Resposta << endl;
   reportar("Flags Fiscais Str:",texto);

   Resposta = ECF_VerificaEstadoImpressoraMFD(&iAck, &iSt1, &iSt2, &iSt3);
   cout << "ECF_VerificaEstadoImpressoraMFD - Resposta: " << dec << Resposta << endl;
   cout << "Verifica Estado Impressora MFD "; 
   DecodificaStatus(&iAck, &iSt1, &iSt2);
   cout << "Codigo de erro: " << iSt3 << endl;

   Resposta = ECF_VerificaEstadoImpressoraStr(texto, texto+10,texto+20);
   cout << "ECF_VerificaEstadoImpressoraStr - Resposta: " << dec << Resposta << endl;
   cout << "Verifica Estado Impressora Str:" << endl; 
   reportar("ST1: ",texto+10);
   reportar("ST2: ",texto+20);

   Resposta = ECF_RetornoImpressora(&iAck, &iSt1, &iSt2);
   cout << "ECF_RetornoImpressora - Resposta: " << dec << Resposta << endl;
   cout << "Retorno impressora "; 
   DecodificaStatus(&iAck, &iSt1, &iSt2);

   Resposta = ECF_RetornoImpressoraMFD(&iAck, &iSt1, &iSt2, &iSt3);
   cout << "ECF_RetornoImpressoraMFD - Resposta: " << dec << Resposta << endl;
   cout << "Retorno Impressora MFD "; 
   DecodificaStatus(&iAck, &iSt1, &iSt2);
   cout << "Codigo de erro: " << iSt3 << endl;

   Resposta = ECF_VerificaEstadoGaveta(&iGav);
   cout <<  "ECF_VerificaEstadoGaveta - Resposta:  " << dec << Resposta << endl;
   cout << "Gaveta: "<< hex << iGav << ((iGav & 1) ? " fechada!" : " aberta!") << endl;

   Resposta = ECF_VerificaEstadoGavetaStr(sGav);
   cout <<  "ECF_VerificaEstadoGavetaStr - Resposta:  " << dec << Resposta << endl;
   cout << "Gaveta: "<< hex << iGav << ((sGav[2] & 1) ? " fechada!" : " aberta!") << endl;

   Resposta = ECF_RetornoImpressoraStr(texto, texto+10,texto+20);
   cout << "ECF_RetornoImpressoraStr - Resposta: " << dec << Resposta << endl;
   cout << "Retorno impressora Str:" << endl; 
   reportar("ST1: ",texto+10);
   reportar("ST2: ",texto+20);

   Resposta = ECF_VerificaTipoImpressora(&iSt1);
   cout << "ECF_VerificaTipoImpressora - Resposta: " << dec << Resposta << endl;
   cout << "Tipo de impressora: " << hex << iSt1 << endl;

   Resposta = ECF_VerificaTipoImpressoraStr(texto);
   cout << "ECF_VerificaTipoImpressoraStr - Resposta: " << dec << Resposta << endl;
   reportar("Tipo de impressora Str: ",texto);

   Resposta = ECF_StatusEstendidoMFD(&flag);
   cout << "ECF_StatusEstendidoMFD - Resposta: " << dec << Resposta << endl;
   cout << "Status estendido MFD: " << hex << flag << endl;
   
   if (flag & 0x01)
	cout << "Comprovante aberto"<< endl;
   if (flag & 0x02)
	cout << "C D C aberto" << endl;
   if (flag & 0x04)
	cout << "Relatorio Gerencial aberto"<< endl;
   if (flag & 0x08)
	cout << "Totalizando o cupom"<< endl;
   if (flag & 0x20)
	cout << "Pode cancelar comprovante" << endl;
   if (flag & 0x40)
	cout << "Estorno de CDC permitido" << endl;
   cout << endl;

   Resposta = ECF_StatusCupomFiscal(texto);
   cout << "ECF_StatusCupomFiscal - Resposta: " << dec << Resposta << endl;
   reportar("Status do cupom fiscal:",texto);

   Resposta = ECF_StatusRelatorioGerencial(texto);
   cout << "ECF_StatusRelatorioGerencial - Resposta: " << dec << Resposta << endl;
   reportar("Status do relatorio gerencial:",texto);

   Resposta = ECF_StatusComprovanteNaoFiscalVinculado(texto);
   cout << "ECF_StatusComprovanteNaoFiscalVinculado - Resposta: " << dec << Resposta << endl;
   reportar("Status do comprovante nao fiscal vinculado:",texto);

   Resposta = ECF_StatusComprovanteNaoFiscalNaoVinculado(texto);
   cout << "ECF_StatusComprovanteNaoFiscalNaoVinculado - Resposta: " << dec << Resposta << endl;
   reportar("Status do comprovante nao fiscal nao vinculado:",texto);

   flag = ECF_VerificaModeloEcf();
   cout << "ECF_VerificaModeloEcf - Modelo do ECF: " << flag << endl;
   switch (flag)
   {
	case 1:
	   cout << "ST100" << endl;
	   break;		
	case 2:
	   cout << "ST1000" << endl;
	   break;		
	case 3:
	   cout << "ST200" << endl;
	   break;		
	case 4:
	   cout << "ST120" << endl;
	   break;		
	case 5:
	   cout << "ST2000" << endl;
	   break;		
	case 6:
	   cout << "ST2500" << endl;
	   break;		
	case 50:
	   cout << "9000IE" << endl;
	   break;		
	case 51:
	   cout << "9000IIE" << endl;
	   break;		
	case 52:
	   cout << "9000IIIE" << endl;
	   break;		
	case 53:
	   cout << "9000II" << endl;
	   break;		
	case 54:
	   cout << "9000I" << endl;
	   break;		
	case 55:
	   cout << "7000IE" << endl;
	   break;		
	case 56:
	   cout << "7000II" << endl;
	   break;		
	case 57:
	   cout << "7000I" << endl;
	   break;		
	default:
	   cout << "erro" << endl;
	   break;		
   }

   Resposta = ECF_VerificaHorarioVerao(texto);
   cout << "ECF_VerificaHorarioVerao - Resposta: " << dec << Resposta << endl;
   reportar("Horario de verao: ",texto);

   Resposta = ECF_VerificaZPendente(texto);
   cout << "ECF_VerificaZPendente - Resposta: " << dec << Resposta << endl;
   reportar("Z pendente: ",texto);

   Resposta = ECF_VerificaDiaAberto(texto);
   cout << "ECF_VerificaDiaAberto - Resposta: " << dec << Resposta << endl;
   reportar("Dia aberto: ",texto);

   Resposta = ECF_PalavraStatus(texto);
   cout << "ECF_PalavraStatus - Resposta: " << dec << Resposta << endl;
   cout << "PalavraStatus: " << texto[0] << texto[1] << texto[2] << texto[3] << texto[4] << texto[5] << texto[6] << texto[7] << texto[8] << texto[9] << texto[10] << texto[11] << texto[12] << endl;

   Resposta = ECF_PalavraStatusBinario(texto);
   cout << "ECF_PalavraStatusBinario - Resposta: " << dec << Resposta << endl;
   reportar("Palavra Status ASCII: ",texto);

   Resposta = ECF_VerificaFlagCorteMFD(&flag);
   cout << "ECF_VerificaFlagCorteMFD - Resposta: " << dec << dec << Resposta << endl;
   cout << "Indicador de corte: " << flag << endl;

   Resposta = ECF_GeraRFD(texto);
   cout << "ECF_GeraRFD - Resposta: " << dec << Resposta << endl;
   reportar("GeraRFD: ",texto);


   Resposta = ECF_FlagsFiscais3MFD(&flag);
   cout << "ECF_FlagsFiscais3MFD - Resposta: " << dec << Resposta << endl;
   cout << "flags: " << flag << endl;

   if (Mensagem == true)
      cout <<endl<<endl<<"**************** Confira os dados exibidos - <<< 5/9 >>>."<< endl;	
   Pausa(true);
#ifndef WIN32
   cout<<"\x1B[2J"<<endl;
#endif
}

void InformDiversos()
{
   char texto[3100];

   cout << endl << endl << " ----------------- D I V E R S O S ------------------------" << endl;
   Resposta = ECF_PercentualLivreMFD(texto);
   cout << "ECF_PercentualLivreMFD - Resposta: " << dec << Resposta << endl;
   reportar("Percentual livre da MFD: ",texto);

   Resposta = ECF_TotalLivreMFD(texto);
   cout << "ECF_TotalLivreMFD - Resposta: " << dec << Resposta << endl;
   reportar("Total livre MFD: ",texto);

   Resposta = ECF_ReducoesRestantesMFD(texto);
   cout << "ECF_ReducoesRestantesMFD - Resposta: " << dec << Resposta << endl;
   reportar("Reducoes restantes: ",texto);

   Resposta = ECF_TamanhoTotalMFD(texto);
   cout << "ECF_TamanhoTotalMFD - Resposta: " << dec << Resposta << endl;
   reportar("Capacidade maxima MFD instalada: ",texto);

   Resposta = ECF_TempoRestanteComprovanteMFD(texto);
   cout << "ECF_TempoRestanteComprovanteMFD -  Resposta: " << dec << Resposta << endl;
   reportar("Tempo restante em segundos: ",texto);

   if (Mensagem == true)
      cout <<endl<<endl<<"**************** Confira os dados exibidos - <<< 6/9 >>>."<< endl;	
   Pausa(true);
#ifndef WIN32
   cout<<"\x1B[2J"<<endl;
#endif
}

void InformAposReducaoZ()
{
   char texto[3100],texto2[3200];

   cout << endl << endl << " ----------------- VALORES APOS A REDUCAO Z  -------------------" << endl;
   Resposta = ECF_DataHoraUltimoDocumentoMFD(texto);
   cout << "ECF_DataHoraUltimoDocumentoMFD - Resposta: " << dec << Resposta << endl;
   reportar("Data/hora do ultimo documento: ",texto);

   Resposta = ECF_DataHoraReducao(texto,texto2);
   cout << "ECF_DataHoraReducao - Resposta: " << dec << Resposta << endl;
   reportar("Data/hora da reducao Z: ",texto);

   Resposta = ECF_DataMovimentoUltimaReducaoMFD(texto);
   cout << "ECF_DataMovimentoUltimaReducaoMFD - Resposta: " << dec << Resposta << endl;
   reportar("Data do movimento ultima reducao: ",texto);

   Resposta = ECF_InicioFimCOOsMFD(texto,texto2);
   cout << "ECF_InicioFimCOOsMFD - Resposta: " << dec << Resposta << endl;
   reportar("COO inicial: ",texto);
   reportar("COO final: ",texto2);

   Resposta = ECF_InicioFimGTsMFD(texto,texto2);
   cout << "ECF_InicioFimGTsMFD - Resposta: " << dec << Resposta << endl;
   reportar("GT inicial: ",texto);
   reportar("GT final: ",texto2);

   Resposta = ECF_GrandeTotalUltimaReducaoMFD(texto);
   cout << "ECF_GrandeTotalUltimaReducaoMFD - Resposta: " << dec << Resposta << endl;
   reportar("Grande Total da ultima reducao: ",texto);

   Resposta = ECF_DadosUltimaReducao(texto);
   cout << "ECF_DadosUltimaReducao - Resposta: " << dec << Resposta << endl;
   reportar("Dados da ultima reducao: ",texto, ',');

   Resposta = ECF_DadosUltimaReducaoMFD(texto);
   cout << "ECF_DadosUltimaReducaoMFD - Resposta: " << dec << Resposta << endl;
   reportar("Dados da ultima reducao MFD: ",texto, ',');

   Resposta = ECF_DadosReducaoMFD("0107", texto);
   cout << "ECF_DadosReducaoMFD - CRZ = " << "0001" << endl;
   cout << "ECF_DadosReducaoMFD - Resposta: " << dec << Resposta << endl;
   reportar("Dados da reducao: ",texto, ',');

   Resposta = ECF_MapaResumo();
   cout << "ECF_MapaResumo - Resposta: " << dec << Resposta << endl;
   texto[0] = '\0';
   Resposta = ECF_RetornaPath(texto);
   cout << "ECF_RetornaPath - Resposta: " << dec << Resposta << endl;
   strcat(texto,BARRA);
   strcat(texto,"RETORNO.TXT");
   cout << "Mapa Resumo - Conteudo do arquivo " << texto << endl; 
   ExibirArquivo(texto);

   Resposta = ECF_MapaResumoMFD();
   cout << "ECF_MapaResumoMFD - Resposta: " << dec << Resposta << endl;
   texto[0] = '\0';
   Resposta = ECF_RetornaPath(texto);
   cout << "ECF_RetornaPath - Resposta: " << dec << Resposta << endl;
   strcat(texto,BARRA);
   strcat(texto,"RETORNO.TXT");
   cout << "Mapa Resumo MFD - Conteudo do arquivo " << texto << endl; 
   ExibirArquivo(texto);

   if (Mensagem == true)
      cout <<endl<<endl<<"**************** Confira os dados exibidos - <<< 7/9 >>>."<< endl;	
   Pausa(true);
#ifndef WIN32
   cout<<"\x1B[2J"<<endl;
#endif
}

void InformSintegra()
{
   char texto[3100];

   cout << endl << endl << " ----------------- S I N T E G R A  ------------------------" << endl;
   Resposta = ECF_RegistrosTipo60();
   cout << "ECF_RegistrosTipo60 - Resposta: " << dec << Resposta << endl;
   texto[0] = '\0';
   Resposta = ECF_RetornaPath(texto);
   cout << "ECF_RegistrosTipo60 - Resposta: " << dec << Resposta << endl;
   strcat(texto,BARRA);
   strcat(texto,"RETORNO.TXT");
   cout << "Resposta = ECF_RegistrosTipo60 - Conteudo do arquivo " << texto << endl; 
   ExibirArquivo(texto);

   Resposta = ECF_RelatorioTipo60Mestre();
   cout << "ECF_RelatorioTipo60Mestre - Resposta: " << dec << Resposta << endl;
   texto[0] = '\0';
   Resposta = ECF_RetornaPath(texto);
   cout << "ECF_RetornaPath - Resposta: " << dec << Resposta << endl;
   strcat(texto,BARRA);
   strcat(texto,"RETORNO.TXT");
   cout << "Resposta = ECF_RelatorioTipo60Mestre - Conteudo do arquivo " << texto << endl; 
   ExibirArquivo(texto);

   Resposta = ECF_RelatorioTipo60Analitico();
   cout << "ECF_RelatorioTipo60Analitico - Resposta: " << dec << Resposta << endl;
   texto[0] = '\0';
   Resposta = ECF_RetornaPath(texto);
   cout << "ECF_RetornaPath - Resposta: " << dec << Resposta << endl;
   strcat(texto,BARRA);
   strcat(texto,"RETORNO.TXT");
   cout << "Resposta = ECF_RelatorioTipo60Analitico - Conteudo do arquivo " << texto << endl; 
   ExibirArquivo(texto);

   Resposta = ECF_RelatorioTipo60AnaliticoMFD();
   cout << "ECF_RelatorioTipo60AnaliticoMFD - Resposta: " << dec << Resposta << endl;
   texto[0] = '\0';
   Resposta = ECF_RetornaPath(texto);
   cout << "ECF_RetornaPath - Resposta: " << dec << Resposta << endl;
   strcat(texto,BARRA);
   strcat(texto,"RETORNO.TXT");
   cout << "Resposta = ECF_RelatorioTipo60AnaliticoMFD - Conteudo do arquivo " << texto << endl; 
   ExibirArquivo(texto);

   Resposta = ECF_RetornaPathMFD(texto);
   cout << "ECF_RetornaPathMFD - Resposta: " << dec << Resposta << endl;
   strcat(texto,BARRA);
   strcat(texto,"SINTEGRA-MFD.TXT");

   ECF_MsgLog(BufLog,sizeof(BufLog));		// descartar log de funcoes anteriores

   Resposta = ECF_ArquivoSintegra2004MFD(256+63,texto,"04","2010","04", "2010", "SWEDA INFORMATICA LTDA","RUA DONA BRIGIDA", "713","SEM COMPLEMENTO","VILA MARIANA","SAO PAULO","SP", "123456", "55745644","SEM FAX", "SEM CONTACTO");
   cout << "ECF_ArquivoSintegra2004MFD - Resposta: " << dec << Resposta << endl;
   cout << "Vide o arquivo " << texto << endl; 

   Resposta = ECF_RetornaPathMFD(texto);
   cout << "ECF_RetornaPathMFD - Resposta: " << dec << Resposta << endl;
   strcat(texto,BARRA);
   strcat(texto,"SINTEGRA-ddmmaa-MFD.TXT");

   Resposta = ECF_ArquivoSintegra2004MFD(256+63,texto,"01/04","2010","20/04", "2010", "S W E D A","RUA DONA BRIGIDA", "713","SEM COMPLEMENTO","VILA MARIANA","SAO PAULO","SP", "123456", "55745644","SEM FAX", "SEM CONTACTO");
   cout << "ECF_ArquivoSintegra2004MFD - Resposta: " << dec << Resposta << endl;
   cout << "Vide o arquivo " << texto << endl; 

   ECF_MsgLog(BufLog,sizeof(BufLog));
   cout << string(BufLog) << endl;		// log da ultima função chamada

   if (Mensagem == true)
      cout <<endl<<endl<<"**************** Confira os dados exibidos  - <<< 8/9 >>>."<< endl;	
   Pausa(true);
#ifndef WIN32
   cout<<"\x1B[2J"<<endl;
#endif
}

void InformDataMov()
{
   char texto[3100];

   cout << endl << endl << " ----------------- DATA DE MOVIMENTO ------------------------" << endl;
   Resposta = ECF_DataMovimento(texto);
   cout << "ECF_DataMovimento - Resposta: " << dec << Resposta << endl;
   reportar("Data do movimento: ",texto);

   if (Mensagem == true)
      cout <<endl<<endl<<"**************** Confira os dados exibidos  - <<< 9/9 >>>."<< endl;	
   Pausa(true);
#ifndef WIN32
   cout<<"\x1B[2J"<<endl;
#endif
}

void InformacoesECF()
{
   Mensagem = true;
// -------------------------------------------- PROGRAMACAO
   InformProg();

// -------------------------------------------- RETORNO DE VALORES DO ULTIMO CUPOM / CUPOM CORRENTE
   InformUltimoDoc();

// -------------------------------------------- RETORNO DOS ACUMULADORES DIARIOS
   InformAcumDiarios();

// -------------------------------------------- RETORNO DOS CONTADORES DIARIOS
   InformContadoresDiarios();

// -------------------------------------------- STATUS 
   InformStatus();
 
// ---------------------------------------------------- DIVERSOS
   InformDiversos();

// ------------------------------------------------ RETORNO DE VALORES APOS A REDUCAO Z
   InformAposReducaoZ();

// ----------------------------------------------------------- SINTEGRA
   InformSintegra();

// ----------------------------------------------------------- DATA DE MOVIMENTO
   InformDataMov();

   Mensagem = false;
}

void MostraBuffer()
{
  Memo1.Lines.Add(string(" "));
  Memo1.Lines.Mostra(false);

#ifndef WIN32
  cout<<"Use <shift>+Page UP ou <shift>+Page DOWN, para navegar."<<endl;
#endif

  if (MessageQ("Deseja limpar buffer (s/n) ? ","")==Y)
     Memo1.Lines.Limpar();
}

void VerificaNaoFiscal()
{ 
  char Recebimento[2300];
  Resposta = ECF_VerificaRecebimentoNaoFiscal(Recebimento);
  cout << "ECF_VerificaRecebimentoNaoFiscal - Resposta: " << dec << Resposta << endl;
  reportar("Recebimentos nao fiscais: ",Recebimento,',');
  Pausa();
}

void RegistradoresFiscais()
{
   char rf[500];
   Resposta = ECF_RetornaRegistradoresFiscais(rf);
   cout << "ECF_RetornaRegistradoresFiscais - Resposta: " << dec << Resposta << endl;
   reportar("Registradores fiscais: ",rf,',');
   Pausa();
}

void LeAliq()
{ 
   char ai[500];
   Resposta = ECF_LerAliquotasComIndice(ai);
   cout << "ECF_LerAliquotasComIndice - Resposta: " << dec << Resposta << endl;
   reportar("Aliquotas e Indices: ",ai,',');
   Pausa();
}

void LeCMC7()
{ 
   char cmc[60];
   Resposta = ECF_LeituraChequeMFD(cmc);
   cout << "ECF_LeituraChequeMFD - Resposta: " << dec << Resposta << endl;
   cout<<"Codigo CMC7: "<<cmc<<endl;
   Resposta = ECF_LiberarCheque();
   cout << "ECF_LiberarCheque - Resposta: " << dec << Resposta << endl;
   Pausa();
}

void GeraFD()
{
   char *down = "downloadmfd-COO.txt";
   char COOi[8];
   char COOf[8];
   char datai[12];
   char dataf[12];
   char pat[1024]; 
   char texto[1024];

   GetTexto("Entre com o numero inicial do COO: ",COOi,6);
   if (COOi[0] == 0)
      return;

   GetTexto("Entre com o numero final do COO: ",COOf,6);

   Resposta = ECF_DownloadMFD(down,"2",COOi,COOf,"");
   Memo1.Lines.Add(string("ECF_DownloadMFD - Resposta: ")+string(inttostr(Resposta)));
   if (Resposta == 1)
   {	
      ECF_RetornaPath(texto);
      strcat(texto,BARRA);
      strcat(texto,down);	
      Memo1.Lines.Add(string((char *) "OK - texto gerado no arquivo ") + string(texto));
      cout << "Gerado fita detalhe COO:" << COOi << " A " << COOf <<  " em: " << texto << endl; 

// -------------------------------------------------------------------------------
      ECF_RetornaPath(texto);
      strcat(texto,BARRA);
	  strcat(texto,"segunda-via-total.TXT");

      Resposta = ECF_FormatoDadosMFD("",texto,"0","","","","");
      Memo1.Lines.Add(string("ECF_FormatoDadosMFD - Resposta: ")+string(inttostr(Resposta)));      
      if (Resposta == 1)
      {
         Memo1.Lines.Add(string("Gerado fita detalhe no arquivo ")+string(texto));
         cout << "Gerado fita detalhe de todo o movimento em: " << texto << endl; 
      }
      else
	 cout << "Erro na geracao do arquivo !" << endl;	

// -------------------------------------------------------------------------------
      ECF_RetornaPath(texto);
	  strcat(texto,BARRA);
      strcat(texto,"segunda-via-COO.TXT");

      GetTexto("Path do arquivo Memoria Fiscal: ",pat,sizeof(pat)-1);
      if (pat[0] == ' ')
          pat[0] = '\0';

      Resposta = ECF_FormatoDadosMFD(pat,texto,"0","2",COOi,COOf,"");
      Memo1.Lines.Add(string("ECF_FormatoDadosMFD - Resposta: ")+string(inttostr(Resposta)));      
      if (Resposta == 1)
      {
         Memo1.Lines.Add(string("Gerado fita detalhe no arquivo ")+string(texto));
         cout << "Gerado fita detalhe COO:" << COOi << " A " << COOf <<  " em: " << texto << endl; 
      }
      else
	 cout << "Erro na geracao do arquivo !" << endl;	
// -------------------------------------------------------------------------------

      GetTexto("Entre com a data inicial: ",datai,10);
      if (datai[0] == 0)
         return;

      GetTexto("Entre com a data final: ",dataf,10);
      if (dataf[0] == 0)
         return;

      ECF_RetornaPath(texto);
	  strcat(texto,BARRA);
      strcat(texto,"segunda-via-data.TXT");

      Resposta = ECF_FormatoDadosMFD(pat,texto,"0","1",datai,dataf,"");
      Memo1.Lines.Add(string("ECF_FormatoDadosMFD - Resposta: ")+string(inttostr(Resposta)));
      if (Resposta == 1)
      {
         Memo1.Lines.Add(string("Gerado fita detalhe no arquivo ")+string(texto));
         cout << "Gerado fita detalhe data:" << datai << " A " << dataf <<  " em: " << texto << endl; 
      }
      else
	 cout << "Erro na geracao do arquivo !" << endl;	
   }
		
   Pausa();
}

void RetIndice()
{
   char indice[3];
   char nome[16];

   GetTexto("Nome do Totalizador Nao Fiscal: ",nome,15);	
   if (nome[0] == 0)
      return;	
   Resposta = ECF_RetornaIndiceComprovanteNaoFiscal(nome, indice);
   cout << "ECF_RetornaIndiceComprovanteNaoFiscal - Resposta: " << dec << Resposta << endl;
   reportar("Indice: ",indice);
   Pausa();
}

void RetMeio()
{
   char valor[15];
   char nome[16];

   GetTexto("Nome do meio de pagamento: ",nome,15);	
   if (nome[0] == 0)
      return; 
   Resposta = ECF_ValorFormaPagamento(nome,valor);
   cout << "ECF_ValorFormaPagamento - Resposta: " << dec << Resposta << endl;
   reportar("Valor: ",valor);
   valor[0] = '\0';
   Resposta =	ECF_ValorFormaPagamentoMFD(nome,valor);
   cout << "ECF_ValorFormaPagamentoMFD - Resposta: " << dec << Resposta << endl;
   reportar("Valor: ",valor);
   Pausa();
}

void RetNFisc()
{
   char valor[15];	
   char nome[16];

   GetTexto("Nome do Totalizador Nao Fiscal: ",nome,15);	
   if (nome[0] == 0)
      return; 

   Resposta = ECF_ValorTotalizadorNaoFiscal(nome,valor);
   cout << "ECF_ValorTotalizadorNaoFiscal - Resposta: " << dec << Resposta << endl;
   reportar("Valor: ",valor);
   valor[0] = '\0';
   Resposta =	ECF_ValorTotalizadorNaoFiscalMFD(nome,valor);
   cout << "ECF_ValorTotalizadorNaoFiscalMFD - Resposta: " << dec << Resposta << endl;
   reportar("Valor: ",valor);
   Pausa();
}

void Lig()
{
   Resposta = ECF_VerificaImpressoraLigada();
   Memo1.Lines.Add(string("ECF_VerificaImpressoraLigada - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_VerificaImpressoraLigada - Resposta: " << dec << Resposta << endl;
   Pausa();
}

void MostraRelogioECF()
{
   int  i;
   char texto[40],texto2[40];
   char buf[128];

   cout << "Ler relogio 32 vezes ..." << endl << endl;
   for (i=0; i < 32; ++i)
   {		
      Resposta = ECF_DataHoraImpressora(texto, texto2);	
      if (Resposta != 1)
          cout << "ECF_DataHoraImpressora - Resposta: " << dec << Resposta << endl;
      sprintf(buf,"%.2s/%.2s/20%.2s  %.2s:%.2s:%.2s",texto,texto+2,texto+4,texto2,texto2+2,texto2+4);
      reportar("Data e hora: ",buf);
   }
   Pausa();
}

//		*********************************************************
//		*							*
//		*							*
//		*	    P  R  O  G  R  A  M  A  C  A  O 		*
//		*							*				
//		*							*
//		*********************************************************

void ProgPar()
{
   char Ecf[4];
   char Loja[5];
   char CasasDecPreco[2];
   char CasasDecQuant[2];
   char iss[2];

   GetTexto("Numero do ECF: ",Ecf,3);
   if (Ecf[0]==0)
      return; 
   GetTexto("Numero da Loja: ",Loja,4);
   GetTexto("Habilitar preco com tres casas decimais (s/n) ? ",CasasDecPreco,1);
   GetTexto("Casas Decimais da quantidade (0 a 3): ",CasasDecQuant,1);
   GetTexto("Habilita desconto de ISSQN (s/n) ? ",iss,1);

   Resposta = ECF_ProgramarParametrosDiversos(Ecf,Loja,CasasDecPreco,CasasDecQuant,iss);
   Memo1.Lines.Add(string("ECF_ProgramarParametrosDiversos - Resposta: ")+string(inttostr(Resposta)));
   Pausa();
}

void ProgCab()
{
   char Razao[60];
   char Fanta[60];
   char Endereco[281];

   GetTexto("Razao social da empresa: ",Razao,59);
   if (Razao[0] == 0)
      return;
   GetTexto("Nome fantasia: ",Fanta,59);
   GetTexto("Endereco: ",Endereco,280);	

   Resposta = ECF_ProgramarCliche(Razao,Fanta,Endereco);
   Memo1.Lines.Add(string("ECF_ProgramarCliche - Resposta: ")+string(inttostr(Resposta)));
   Pausa();
}

void ProgVerao()
{
   Resposta = ECF_ProgramaHorarioVerao();
   Memo1.Lines.Add(string("ECF_ProgramaHorarioVerao - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_ProgramaHorarioVerao - Resposta: " << dec << Resposta << endl;
   Pausa();
}

void ProgramarAliquota()
{  char aliq[10];
   char x[2];
   cout<<"                                              Programar aliquota                       "<<endl;

   if (MessageQ("Zerar Tabela de aliquotas (s/n s=apenas em MIT) ?", "Questao")==Y)
   {
       Resposta = ECF_ApagaTabelaAliquotas();	
       Memo1.Lines.Add(string("ECF_ApagaTabelaAliquotas - Resposta: ")+string(inttostr(Resposta)));
   }
   while (1)
   {
      GetTexto("Digite o valor da aliquota, formato xxyy, onde  xx valor e yy decimais: ",aliq,4);
      if (aliq[0] == 0)
        return;

      GetTexto("Imposto da operacao (0 = ICMS   1 = ISS):",x,1);
      if (x[0] == 0)
         return;
      Resposta = ECF_ProgramaAliquota(aliq, (x[0] & 0x0f));
      Memo1.Lines.Add(string("ECF_ProgramaAliquota - Resposta: ")+string(inttostr(Resposta)));
      cout << "ECF_ProgramaAliquota - Resposta: " << dec << Resposta << endl;
      if (Resposta > 0)
         MStatusECF ();
      else
         MRetornoECF();
   }
}

void NomearTotalizador()
{
  char indice[3];
  char cTot[16];

   if (MessageQ("Zerar nomes dos Totalizadores nao fiscais (s/n s=apenas em MIT) ?", "Questao")==Y)
   {
       Resposta = ECF_ApagaTabelaNomesNaoFiscais();	
       Memo1.Lines.Add(string("ECF_ApagaTabelaNomesNaoFiscais - Resposta:  ")+string(inttostr(Resposta)));
   }

   while (1)
   {	 
      GetTexto("Indique um indice para o totalizador: ",indice,2);
      if (indice[0] == 0)
	 return;	

      GetTexto("Entre com o nome do totalizador: ",cTot,15);
      if (cTot[0] == 0)
         return;	 

      Resposta = ECF_NomeiaTotalizadorNaoSujeitoIcms(atoi(indice), cTot);
      Memo1.Lines.Add(string("ECF_NomeiaTotalizadorNaoSujeitoIcms - Resposta: ")+string(inttostr(Resposta)));
      cout << "ECF_NomeiaTotalizadorNaoSujeitoIcms - Resposta: " << dec << Resposta << endl;
      if (Resposta > 0)
         MStatusECF ();
      else
         MRetornoECF();
   }
}

void NomeOpera()
{
  char nome[21];

  GetTexto("Entre com o nome do operador: ",nome,20);
   if (nome[0] == 0)
      return; 

  Resposta = ECF_ProgramaOperador(nome);
  Memo1.Lines.Add(string("ECF_ProgramaOperador - Resposta: ")+string(inttostr(Resposta)));
  if (Resposta > 0)
     MStatusECF ();
  else
     MRetornoECF();

  Pausa();
}

void MeioPagamento()
{ 
   char tef[2];
   char nome[16];	

   if (MessageQ("Zerar nomes dos meios de pagamentoa (s/n s=apenas em MIT) ?", "Questao")==Y)
   {
       Resposta = ECF_ApagaTabelaNomesFormasdePagamento();	
       Memo1.Lines.Add(string("ECF_ApagaTabelaNomesFormasdePagamento - Resposta:  ")+string(inttostr(Resposta)));
   }

   while (1)
   {
      GetTexto("Nome do meio de pagamento: ",nome,15);	
      if (nome[0] == 0)
         return; 

      GetTexto("Permite TEF (0= nao   1= sim): ",tef,1);
      if (tef[0] == 0)
	  return;		
      
      Resposta = ECF_ProgramaFormaPagamentoMFD(nome,tef);
      Memo1.Lines.Add(string("ECF_ProgramaFormaPagamentoMFD - Resposta:  ")+string(inttostr(Resposta)));

      cout << "ECF_ProgramaFormaPagamentoMFD - Resposta: " << dec << Resposta << endl;
      if (Resposta > 0)
         MStatusECF ();
      else
         MRetornoECF();
   }
}

void Meiospagamento()
{
   int  n; 
   char nome[20];	
   char buf[40];
   string texto;

   if (MessageQ("Zerar nomes dos meios de pagamentoa (s/n s=apenas em MIT) ?", "Questao")==Y)
   {
       Resposta = ECF_ApagaTabelaNomesFormasdePagamento();	
       Memo1.Lines.Add(string("ECF_ApagaTabelaNomesFormasdePagamento - Resposta:  ")+string(inttostr(Resposta)));
   }

   for (n=0; n < 20; n++)
   {
       sprintf(buf,"Nome do meio de pagamento %d:",n+1);
       GetTexto(buf,nome,16);	
       if (nome[0] == 0)
          break;
       texto += nome;
       texto += ",";
   }
   if (n == 0)
      return;	
   cout << "Aguarde ..."<< endl;
   Resposta = ECF_ProgramaFormasPagamento((char *) texto.c_str());
   Memo1.Lines.Add(string("ECF_ProgramaFormasPagamento - Resposta: ")+string(inttostr(Resposta)));
   if (Resposta == 1)
      cout << "ECF_ProgramaFormasPagamento - Resposta: " << dec << Resposta << endl;
   if (Resposta > 0)
      MStatusECF ();
   else
      MRetornoECF();
   Pausa();
}

void ProgRG()
{
  char indice[3];
  char cTot[16];

   if (MessageQ("Zerar titulos dos Relatorios Gerenciais (s/n s=apenas em MIT) ?", "Questao")==Y)
   {
       Resposta = ECF_ApagaTabelaNomesRelatoriosGerenciais();	
       Memo1.Lines.Add(string("ECF_ApagaTabelaNomesRelatoriosGerenciais - Resposta:  ")+string(inttostr(Resposta)));
   }

   while (1)
   {	
      GetTexto("Indique um indice para o totalizador: ",indice,2);
      if (indice[0] == 0)
         return;	
     
      GetTexto("Entre com o nome do totalizador: ",cTot,15);
      if (cTot[0] == 0)
	 return; 	
      
      Resposta = ECF_NomeiaRelatorioGerencialMFD(indice,cTot);
      Memo1.Lines.Add(string("ECF_NomeiaRelatorioGerencialMFD - Resposta: ")+string(inttostr(Resposta)));
      cout << "ECF_NomeiaRelatorioGerencialMFD - Resposta: " << dec << Resposta << endl;
      if (Resposta > 0)
         MStatusECF ();
      else
         MRetornoECF();
   }	
}

void ProgFec()
{
    char fec[2];

    GetTexto("Habilitar fechamento automatico do cupom (0 = sim) ? ",fec,1);
    if (fec[0] == 0)
        return;
    Resposta = ECF_CfgFechaAutomaticoCupom(fec);
    Memo1.Lines.Add(string("ECF_CfgFechaAutomaticoCupom - Resposta: ")+string(inttostr(Resposta)));
    cout << "ECF_CfgFechaAutomaticoCupom - Resposta: " << dec << Resposta << endl;
    Pausa();
}

void ProgRel()
{
    char data[12];
    char hora[10];
    char verao[2];

    GetTexto("data: ",data,10);
    if (data[0] == 0)
	return;
    GetTexto("Hora: ",hora,8);
    GetTexto("Verao (0=normal 1=verao 2=nao mexer) : ",verao,1);		

    Resposta = ECF_ProgramarRelogio(data,hora,verao);
    Memo1.Lines.Add(string("ECF_ProgramarRelogio - Resposta: ")+string(inttostr(Resposta)));
    cout << "ECF_ProgramarRelogio - Resposta: " << dec << Resposta << endl;
    if (Resposta > 0)
         MStatusECF ();
    else
         MRetornoECF();
    Pausa();
}

void ConfigECF()
{
  char  corte[2];
  char  velocidade[10];
  char  modo[2];
  char  beep[2];  

   GetTexto("Corte: parcial=1 total=2  manual=3: ",corte,1);
   if (corte[0] == 0)
      return;
   GetTexto("Velocidade (Baud rate):  ",velocidade,6);

   if (ECF_VerificaModeloEcf()==6)
   {
      GetTexto("Impressao (1=rapida   2=qualidade): ",modo,1);

      GetTexto("Bip (1= desliga  2=liga): ",beep,1);
   }
   else
   {
      modo[0] = '\0';
      beep[0] = '\0';
   }
  Resposta = ECF_ConfigurarECF(corte,velocidade,modo,beep);
  Memo1.Lines.Add(string("ECF_ConfigurarECF - Resposta: ")+string(inttostr(Resposta)));
  Pausa();
}

void CFAdicional()
{
static bool Segundo = false;

   Resposta = ECF_CfgCupomAdicional( (Segundo == false) ? (char *) "1" : (char *) "0"); 
   Memo1.Lines.Add(string("ECF_CfgCupomAdicional - Resposta: ")+string(inttostr(Resposta)));

   Segundo = !Segundo;
   Pausa();
}

void Arredond()
{
     char buf[2];

     Resposta = ECF_VerificaTruncamento(buf);
     Memo1.Lines.Add(string("ECF_VerificaTruncamento - Resposta: ")+string(inttostr(Resposta)));
     if (buf[0] == '0')
     {
         Resposta = ECF_ProgramaTruncamento();
         Memo1.Lines.Add(string("ECF_ProgramaTruncamento - Resposta: ")+string(inttostr(Resposta)));
     }
     else
     {	
         Resposta = ECF_ProgramaArredondamento();
         Memo1.Lines.Add(string("ECF_ProgramaArredondamento- Resposta: ")+string(inttostr(Resposta)));
     }
    Pausa();
}

void ProgIsentos()
{
    char nF[2];	
    char nI[2];
    char nN[2];
    char nFS[2];
    char nIS[2];
    char nNS[2];

    GetTexto("Numero de Totalizadores tipo Substituicao Tributaria ICMS ('F' - 1 a 3): ",nF,1);
    if (nF[0] == 0)
	return;

    GetTexto("Numero de Totalizadores tipo Isentos ICMS ('I' - 1 a 3): ",nI,1); 
    if (nI[0] == 0)
	return;

    GetTexto("Numero de Totalizadores tipo Nao Tributado ('N' - 1 a 3): ",nN,1); 
    if (nN[0] == 0)
	return;

    GetTexto("Numero de Totalizadores tipo Substituicao Tributaria ISSQN ('FS' - 1 a 3): ",nFS,1); 
    if (nFS[0] == 0)
	return;

    GetTexto("Numero de Totalizadores tipo Isentos ISSQN ('IS' - 1 a 3): ",nIS,1); 
    if (nIS[0] == 0)
	return;

    GetTexto("Numero de Totalizadores tipo Nao Tributado ISSQN ('NS' - 1 a 3): ",nNS,1); 
    if (nNS[0] == 0)
	return;
 
    Resposta = ECF_ProgramarTotalizadoresNaoTributados(nF,nI,nN,nFS,nIS,nNS);
    Memo1.Lines.Add(string("ECF_ProgramarTotalizadoresNaoTributados - Resposta:  ")+string(inttostr(Resposta)));
    Pausa();
}

void ProgCorte()
{
    int corte;

    cout << "0= Desabilita  1= Ativa corte  2=Deixa posicionado para eventual corte: ";
    cin >> corte;
    cout << endl;
    Resposta = ECF_AtivaDesativaCorteProximoMFD(corte);
    Memo1.Lines.Add(string("ECF_AtivaDesativaCorteProximoMFD - Resposta:  ")+string(inttostr(Resposta)));
    Pausa();
}

void ProgLogoAut()
{
    char logotipo[(80*4)+1];

    GetTexto("Valores representando até 80 colunas, separados por vírgula (Ex 001,002...) : ",logotipo,sizeof(logotipo)-1);
    Resposta = ECF_ProgramaCaracterAutenticacao(logotipo);
    Memo1.Lines.Add(string("ECF_ProgramaCaracterAutenticacao - Resposta:  ")+string(inttostr(Resposta)));
    Pausa();
}

void ProgLeiaute()
{
    int    n;
    char   banco[4];
    char   linha[128];
    char   texto[1024];
    string inleiaute;
    ifstream infile;

    cout << "Leitura do leiaute de cheques..."<< endl;
    Resposta = ECF_LeituraLeiautesCheques();
    Memo1.Lines.Add(string("ECF_LeituraLeiautesCheques - Resposta:  ")+string(inttostr(Resposta)));

    Resposta = ECF_RetornaPath(texto);
    cout << "ECF_RetornaPath - Resposta: " << dec << Resposta << endl;
	strcat(texto,BARRA);
    strcat(texto,"RETORNO.TXT");
    ExibirArquivo(texto);

    GetTexto("Numero do Banco: ",banco,3);
    if (banco[0] == 0)
	return;

    infile.open (texto, ifstream::in);
    if (infile.is_open())
    {
      while (infile.good()==true && infile.eof()==false && infile.bad()==false && infile.fail()==false)
      {
         infile.getline(linha,sizeof(linha)-1);		// pega ate' achar \n que e' descartado
	 n = infile.gcount();
  	 if (n < 0)
	     break;
         linha[n] = '\0';
         if (memcmp(linha,banco,3)==0)
         {
	    inleiaute = linha+4;
	    break;		
         }
      }
      infile.close();
    }

    GetTextoPos("Valor - Horizontal (mm): ", inleiaute,0,3);
    GetTextoPos("Valor - Vetical (mm): ", inleiaute,3,3);

    GetTextoPos("Extenso1 - Horizontal (mm): ", inleiaute,6,3);
    GetTextoPos("Extenso1 - Vertical (mm): ", inleiaute,9,3);

    GetTextoPos("Extenso2 - Horizontal (mm): ", inleiaute,12,3);
    GetTextoPos("Extenso2 - Vertical (mm): ", inleiaute,15,3);

    GetTextoPos("Favorecido - Horizontal (mm): ", inleiaute,18,3);
    GetTextoPos("Favorecido - Vertical (mm): ", inleiaute,21,3);

    GetTextoPos("Dia - Horizontal (mm): ", inleiaute,24,3);
    GetTextoPos("Dia - Vertical (mm): ", inleiaute,27,3);

    GetTextoPos("Posicao do ano: ", inleiaute,30,3);

    GetTextoPos("Rodape - Horizontal (mm): ", inleiaute,33,3);
    GetTextoPos("Rodape - Vertical (mm): ", inleiaute,36,3);
    GetTextoPos("Comprimento do cheque (mm): ", inleiaute,39,3);
    GetTextoPos("Numero de digitos do ano: ", inleiaute,42,3);
    GetTextoPos("Descritivo do banco: ", inleiaute,45,20);

    strcpy(texto,inleiaute.c_str());
    if (inleiaute.size() < 45)
        return;
    Resposta = ECF_ProgramarLeiauteCheque(banco,texto);
    Memo1.Lines.Add(string("ECF_ProgramarLeiauteCheque - Resposta:  ")+string(inttostr(Resposta)));
    Pausa();
}

void ProgJan()
{
	char  sempap[2];
	char  eventos[2];

		GetTexto("Mostra aviso SEM PAPEL/SEM TAMPA (1=sim 0=nao)",sempap,1); 
    if (sempap[0] == 0)
	    return;
    GetTexto("Mostra aviso de evento (1=sim 0=nao)",eventos,1); 
    if (eventos[0] == 0)
	    return;

	Resposta = ECF_LigaDesligaJanelas(sempap,eventos);
    Memo1.Lines.Add(string("ECF_LigaDesligaJanelas - Resposta:  ")+string(inttostr(Resposta)));
    Pausa();
}
//		*********************************************************
//		*							*
//		*							*
//		*	        C  A  P  T  U  R  A  S      		*
//		*							*				
//		*							*
//		*********************************************************

void CapLeitx()
{
   char texto[1024];

   cout << "Aguarde..."<< endl;
   Resposta = ECF_LeituraXSerial();
   Memo1.Lines.Add(string("ECF_LeituraXSerial - Resposta: ")+string(inttostr(Resposta)));
   Resposta = ECF_RetornaPath(texto);
   if (Resposta == 1)
   {
	  strcat(texto,BARRA);
      strcat(texto,"RETORNO.TXT");
      cout << "Vide o arquivo " << texto << endl; 
   }
   else
      cout << "Erro na geracao do arquivo !" << endl;	

   Pausa();
}

void Capturalmf()
{ 
   char crzi[7];
   char crzf[7];
   char datai[12];
   char dataf[12];
   char texto[1024];

   Resposta = ECF_RetornaPath(texto);
   strcat(texto,BARRA);
   strcat(texto,"RETORNO.TXT");

   GetTexto("CRZ inicial: ",crzi,6);

   if (crzi[0] != 0)
   {
        GetTexto("CRZ final: ",crzf,6);
        cout << "Aguarde leitura simplificada... " << endl; 
        Resposta = ECF_LeituraMemoriaFiscalSerialReducaoMFD(crzi, crzf,"S");
        Memo1.Lines.Add(string("ECF_LeituraMemoriaFiscalReducaoMFD - Simplificada - Resposta:  ")+string(inttostr(Resposta)));

        if (Resposta == 1)
           cout << "Vide o arquivo " << texto << endl; 
	else
	   cout << "erro: " << Resposta << endl; 
	Pausa();

        cout << "Aguarde leitura completa... " << endl; 
        Resposta = ECF_LeituraMemoriaFiscalSerialReducaoMFD(crzi, crzf,"C");
        Memo1.Lines.Add(string("ECF_LeituraMemoriaFiscalReducaoMFD - Completa - Resposta:  ")+string(inttostr(Resposta)));

        if (Resposta == 1)
           cout << "Vide o arquivo " << texto << endl; 
	else
	   cout << "erro: " << Resposta << endl; 

   }

   GetTexto("Data inicial: ",datai,10);

   if (datai[0] != 0)
   {
       GetTexto("Data final: ",dataf,10);
       cout << "Aguarde leitura simplificada... " << endl; 

       Resposta = ECF_LeituraMemoriaFiscalSerialDataMFD(datai,dataf,"S");
       Memo1.Lines.Add(string("ECF_LeituraMemoriaFiscalDataMFD - Simplificada - Resposta: ")+string(inttostr(Resposta)));

       if (Resposta == 1)
           cout << "Vide o arquivo " << texto << endl; 
       else
	   cout << "erro: " << Resposta << endl; 

       Pausa();

       cout << "Aguarde leitura completa... " << endl; 
       Resposta = ECF_LeituraMemoriaFiscalSerialDataMFD(datai,dataf,"C");
       Memo1.Lines.Add(string("ECF_LeituraMemoriaFiscalDataMFD - Completa - Resposta: ")+string(inttostr(Resposta)));
   }
        if (Resposta == 1)
           cout << "Vide o arquivo " << texto << endl; 
	else
	   cout << "erro: " << Resposta << endl; 
   Pausa();
}

void CapturarLeituraX()
{  
   char *pq; 
   char *pq2= "0";
   char texto[1024];	

   pq = (MessageQ("Deseja capturar o documento (s/n) ?","\n\n\nImprimir ou capturar")==Y) ? (char *) "leitx.txt":  (char *) "" ;

   if (*pq)
   {
       pq2 = (char *) ((MessageQ("Exibe a leitura na tela (s/n) ?","")==Y) ? "1" :  "0");
#ifndef WIN32
       if (*pq2 == '1')
           cout<<"\x1B[2J"<<endl;
#endif
       cout<<"Iniciando transferencia...\n\n\n"<<endl;
   }
   Resposta = ECF_CapturaDocumentos("0",0,0,pq,pq2);
   Memo1.Lines.Add(string("ECF_CapturaDocumentos - opcao 0 - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_CapturaDocumentos - Resposta: " << dec << Resposta << endl;

   if (Resposta == 1 && *pq)
   {
        ECF_RetornaPath(texto);
	if (texto[0])
	    strcat(texto,BARRA);	
	strcat(texto,pq);
        Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
	cout << "Gerado:" << texto << endl;
   }
   else
      if (*pq)
          cout << "Erro na geracao do arquivo !" << endl;	

   Pausa((*pq2 == '1') ? true : false);
}

void LerMF()
{
   char *pq;
   char *pq2= "0";
   char crzi[7];
   char crzf[7];
   char texto[1024];

   pq = (MessageQ("Deseja capturar o documento (s/n) ?","\n\n\nImprimir ou capturar")==Y) ? (char *) "leitMFCRZs.txt":  (char *) "" ;

   GetTexto("CRZ inicial: ",crzi,6);

   if (crzi[0] == 0)
   {
      Pausa();
      return;
   }
   GetTexto("CRZ final: ",crzf,6);

   if (*pq)
   {
       pq2 = (char *) ((MessageQ("Exibe a leitura na tela (s/n) ?","")==Y) ? "1" :  "0");
#ifndef WIN32
       if (*pq2 == '1')
           cout<<"\x1B[2J"<<endl;
#endif
       cout<<"Iniciando transferencia...\n\n\n"<<endl;
   }

   Resposta = ECF_CapturaDocumentos("1",crzi,crzf,pq,pq2);
   Memo1.Lines.Add(string("ECF_CapturaDocumentos - opcao 1 - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_CapturaDocumentos - Resposta: " << dec << Resposta << endl;
   if (Resposta == 1 && *pq)
   {
        ECF_RetornaPath(texto);
	if (texto[0])
	    strcat(texto,BARRA);	
	strcat(texto,pq);
        Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
	cout << "Gerado:" << texto << endl;
   }
   else
      if (*pq)
         cout << "Erro na geracao do arquivo !" << endl;	

   Pausa((*pq2 == '1') ? true : false);
}

void LerMFc()
{
   char *pq;
   char *pq2= "0";
   char crzi[7];
   char crzf[7];
   char texto[1024];

   pq = (MessageQ("Deseja capturar o documento (s/n) ?","\n\n\nImprimir ou capturar")==Y) ? (char *) "leitMFCRZc.txt":  (char *) "" ;

   GetTexto("CRZ inicial: ",crzi,6);

   if (crzi[0] == 0)
   {
      Pausa();
      return;
   }
   GetTexto("CRZ final: ",crzf,6);

   if (*pq)
   {
       pq2 = (char *) ((MessageQ("Exibe a leitura na tela (s/n) ?","")==Y) ? "1" :  "0");
#ifndef WIN32
       if (*pq2 == '1')
           cout<<"\x1B[2J"<<endl;
#endif
       cout<<"Iniciando transferencia...\n\n\n"<<endl;
   }

   Resposta = ECF_CapturaDocumentos("2",crzi,crzf,pq,pq2);
   Memo1.Lines.Add(string("ECF_CapturaDocumentos - opcao 2 - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_CapturaDocumentos - Resposta: " << dec << Resposta << endl;
   if (Resposta == 1 && *pq)
   {
        ECF_RetornaPath(texto);
	if (texto[0])
	    strcat(texto,BARRA);	
	strcat(texto,pq);
        Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
	cout << "Gerado:" << texto << endl;
   }
   else
      if (*pq)
          cout << "Erro na geracao do arquivo !" << endl;	

   Pausa((*pq2 == '1') ? true : false);
}

void LerMF_Data()
{
   char  *pq;
   char  *pq2= "0";
   char  datai[12];
   char  dataf[12]; 
   char  texto[1024];

   pq = (MessageQ("Deseja capturar o documento (s/n) ?","\n\n\nImprimir ou capturar")==Y) ? (char *) "leitMFDatas.txt":  (char *) "" ;

   GetTexto("Data inicial: ",datai,10);

   if (datai[0] == 0)
   {
      Pausa();
      return; 
   }
   GetTexto("Data final: ",dataf,10);

   if (*pq)
   {
       pq2 = (char *) ((MessageQ("Exibe a leitura na tela (s/n) ?","")==Y) ? "1" :  "0");
#ifndef WIN32
       if (*pq2 == '1')
           cout<<"\x1B[2J"<<endl;
#endif
       cout<<"Iniciando transferencia...\n\n\n"<<endl;
   }

   Resposta = ECF_CapturaDocumentos("3",datai,dataf,pq,pq2);
   Memo1.Lines.Add(string("ECF_CapturaDocumentos - opcao 3 - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_CapturaDocumentos - Resposta: " << dec << Resposta << endl;
   if (Resposta == 1 && *pq)
   {
        ECF_RetornaPath(texto);
	if (texto[0])
	    strcat(texto,BARRA);	
	strcat(texto,pq);
        Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
	cout << "Gerado:" << texto << endl;
   }
   else
      if (*pq)
         cout << "Erro na geracao do arquivo !" << endl;	

   Pausa((*pq2 == '1') ? true : false);
}

void LerMF_Datac()
{
   char *pq; 
   char *pq2 = "0";
   char  datai[12];
   char  dataf[12]; 
   char  texto[1024];

   pq = (MessageQ("Deseja capturar o documento (s/n) ?","\n\n\nImprimir ou capturar")==Y) ? (char *) "leitMFDatac.txt":  (char *) "" ;

   GetTexto("Data inicial: ",datai,10);

   if (datai[0] == 0)
   {
      Pausa();
      return; 
   }
   GetTexto("Data final: ",dataf,10);

   if (*pq)
   {
       pq2 = (char *) ((MessageQ("Exibe a leitura na tela (s/n) ?","")==Y) ? "1" :  "0");
#ifndef WIN32
       if (*pq2 == '1')
           cout<<"\x1B[2J"<<endl;
#endif
       cout<<"Iniciando transferencia...\n\n\n"<<endl;
   }

   Resposta = ECF_CapturaDocumentos("4",datai,dataf,pq,pq2);
   Memo1.Lines.Add(string("ECF_CapturaDocumentos - opcao 4 - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_CapturaDocumentos - Resposta: " << dec << Resposta << endl;
   if (Resposta == 1 && *pq)
   {
        ECF_RetornaPath(texto);
	if (texto[0])
	    strcat(texto,BARRA);	
	strcat(texto,pq);
        Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
	cout << "Gerado:" << texto << endl;
   }
   else
      if (*pq)
          cout << "Erro na geracao do arquivo !" << endl;	

   Pausa((*pq2 == '1') ? true : false);
}

void LerMFD()
{
   char  *pq;
   char  *pq2 = "0";
   char  COOi[7];
   char  COOf[7]; 
   char  texto[1024];

   pq = (MessageQ("Deseja capturar o documento (s/n) ?","\n\n\nImprimir em  M  I  T  ou capturar")==Y) ? (char *) "leitFDCOO.txt":  (char *) "" ;

   GetTexto("C O O inicial: ",COOi,6);

   if (COOi[0] == 0)
   {
      Pausa();
      return; 
   }
   GetTexto("C O O  final: ",COOf,6);

   if (*pq)
   {
       pq2 = (char *) ((MessageQ("Exibe a leitura na tela (s/n) ?","")==Y) ? "1" :  "0");
#ifndef WIN32
       if (*pq2 == '1')
           cout<<"\x1B[2J"<<endl;
#endif
       cout<<"Iniciando transferencia...\n\n\n"<<endl;
   }

   Resposta = ECF_CapturaDocumentos("5",COOi,COOf,pq,pq2);
   Memo1.Lines.Add(string("ECF_CapturaDocumentos - opcao 5 - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_CapturaDocumentos - Resposta: " << dec << Resposta << endl;
   if (Resposta == 1 && *pq)
   {
        ECF_RetornaPath(texto);
	if (texto[0])
	    strcat(texto,BARRA);	
	strcat(texto,pq);
        Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
	cout << "Gerado:" << texto << endl;
   }
   else
      if (*pq)
         cout << "Erro na geracao do arquivo !" << endl;	

   Pausa((*pq2 == '1') ? true : false);
}

void LerMFD_Data()
{
   char *pq;
   char *pq2 = "0";
   char  datai[12];
   char  dataf[12]; 
   char  texto[1024];

   pq = (MessageQ("Deseja capturar o documento (s/n) ?","\n\n\nImprimir em   M  I  T   ou capturar")==Y) ? (char *) "leitFDData.txt":  (char *) "" ;

   GetTexto("Data inicial: ",datai,10);

   if (datai[0] == 0)
   {
      Pausa();
      return; 
   }
   GetTexto("Data final: ",dataf,10);

   if (*pq)
   {
       pq2 = (char *) ((MessageQ("Exibe a leitura na tela (s/n) ?","")==Y) ? "1" :  "0");
#ifndef WIN32
       if (*pq2 == '1')
           cout<<"\x1B[2J"<<endl;
#endif
       cout<<"Iniciando transferencia...\n\n\n"<<endl;
   }

   Resposta = ECF_CapturaDocumentos("6",datai,dataf,pq,pq2);
   Memo1.Lines.Add(string("ECF_CapturaDocumentos - opcao 6 - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_CapturaDocumentos - Resposta: " << dec << Resposta << endl;
   if (Resposta == 1 && *pq)
   {
        ECF_RetornaPath(texto);
	if (texto[0])
	    strcat(texto,BARRA);	
	strcat(texto,pq);
        Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
	cout << "Gerado:" << texto << endl;
   }
   else
      if (*pq)
         cout << "Erro na geracao do arquivo !" << endl;	

   Pausa((*pq2 == '1') ? true : false);
}

void LerParametros()
{
   char *pq;
   char *pq2= "0";
   char  texto[1024];

   pq = (MessageQ("Deseja capturar o documento (s/n) ?","\n\n\nImprimir ou capturar")==Y) ? (char *) "leitP.txt":  (char *) "" ;

   if (*pq)
   {
       pq2 = (char *) ((MessageQ("Exibe a leitura na tela (s/n) ?","")==Y) ? "1" :  "0");
#ifndef WIN32
       if (*pq2 == '1')
           cout<<"\x1B[2J"<<endl;
#endif
       cout<<"Iniciando transferencia...\n\n\n"<<endl;
   }

   Resposta = ECF_CapturaDocumentos("7",0,0,pq,pq2);
   Memo1.Lines.Add(string("ECF_CapturaDocumentos - opcao 7 - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_CapturaDocumentos - Resposta: " << dec << Resposta << endl;
   if (Resposta == 1 && *pq)
   {
        ECF_RetornaPath(texto);
	if (texto[0])
	    strcat(texto,BARRA);	
	strcat(texto,pq);
        Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
	cout << "Gerado:" << texto << endl;
   }
   else
      if (*pq)
         cout << "Erro na geracao do arquivo !" << endl;	

   Pausa((*pq2 == '1') ? true : false);
}

void LerSintegra()
{
   char  *pq = "SINTEGRA.TXT";
   char   mes[3];
   char   ano[5];
   char   texto[1024];

   GetTexto("Entre com o mes encerrado: ",mes,2);
   if (mes[0] == 0)
       return;	
   GetTexto("Entre com o ano: ",ano,4);
   if (ano[0] == 0)
       return;

   ECF_RetornaPathMFD(texto);
   strcat(texto,BARRA);
   strcat(texto,pq);
   Resposta = ECF_RelatorioSintegraMFD(63,texto,mes,ano,"CASA RIO PRATA S/A","RUA FREI CANECA", "111","SEM COMPLEMENTO","CENTRO","RIO DE JANEIRO  RJ","987654", "55745644","SEM FAX", "SEM CONTACTO");
   Memo1.Lines.Add(string("ECF_RelatorioSintegraMFD - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_RelatorioSintegraMFD - Resposta: " << dec << Resposta << endl;

   if (Resposta == 1)
   {
	ECF_RetornaPathMFD(texto);
        strcat(texto,BARRA);
	strcat(texto,pq);
	Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
	cout << "Gerado:" << texto << endl;
        cout << "codificacao WINDOWS CODE PAGE. " << endl;	
   }
   else
       cout << "Erro na geracao do arquivo !" << endl;	

   Pausa();
}

void LerSintegra2()
{
   char   mesi[3];
   char   anoi[5];
   char   mesf[3];
   char   anof[5];
   char	  razao[120];
   char   endereco[200];	
   char   numero[40];
   char   bairro[128];
   char   municipio[128];
   char   sigla[3];
   char   texto[1024];

   GetTexto("Entre com o mes inicial encerrado: ",mesi,2);
   if (mesi[0] == 0)
      return;	

   GetTexto("Entre com o ano inicial encerrado: ",anoi,4);
   if (anoi[0] == 0)
      return;	

   GetTexto("Entre com o mes final encerrado: ",mesf,2);
   if (mesf[0] == 0)
      return;	

   GetTexto("Entre com o ano final encerrado: ",anof,4);
   if (anof[0] == 0)
      return;	

   GetTexto("Razao social: ",razao,sizeof(razao)-1);
   if (razao[0] == 0)
      return;	

   GetTexto("Endereco: ",endereco,sizeof(endereco)-1);
   if (endereco[0] == 0)
      return;	

   GetTexto("Numero: ",numero,sizeof(numero)-1);
   if (numero[0] == 0)
      return;	

   GetTexto("Bairro: ",bairro,sizeof(bairro)-1);
   if (bairro[0] == 0)
      return;	

   GetTexto("Municipio: ",municipio,sizeof(municipio)-1);
   if (municipio[0] == 0)
      return;	

   GetTexto("Sigla: ",sigla,sizeof(sigla)-1);
   if (sigla[0] == 0)
      return;	

   Resposta = ECF_RetornaPathMFD(texto);
   Memo1.Lines.Add(string("ECF_RetornaPathMFD - Resposta: ")+string(inttostr(Resposta)));
   strcat(texto,BARRA);
   strcat(texto,"SINTEGRA-MFD.TXT");

   Resposta = ECF_ArquivoSintegra2004MFD(256+63,texto,mesi,anoi,mesf,anof,razao,endereco, numero,"SEM COMPLEMENTO",bairro,municipio,sigla, "123456", "55745644","SEM FAX", "SEM CONTACTO");
   cout << "ECF_ArquivoSintegra2004MFD - Resposta: " << dec << Resposta << endl;
   cout << "Vide o arquivo " << texto << endl; 
   Memo1.Lines.Add(string("ECF_ArquivoSintegra2004MFD - Resposta: ")+string(inttostr(Resposta)));
   if (Resposta == 1)
   {
       Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
       cout << "assume codificacao WINDOWS CODE PAGE. " << endl;	
   }
   else
       cout << "Erro na geracao do arquivo !" << endl;	

   Pausa();
}


void CapSB()
{
   char *pq= "SoftBasico.bin";
   char texto[1024];

   cout << "Aguarde..." << endl;

   Resposta = ECF_DownloadSB(pq);
   Memo1.Lines.Add(string("ECF_DownloadSB - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_DownloadSB - Resposta: " << dec << Resposta << endl;
   if (Resposta == 1)
   {
       ECF_RetornaPath(texto);
       if (texto[0])
	   strcat(texto,BARRA);	
       strcat(texto,pq);
       Memo1.Lines.Add(string("Gerado o arquivo ")+string(texto));
       cout << "Gerado: "<< texto << endl;
   }
   else
      cout << "Erro na geracao do arquivo !" << endl;	

   Pausa();
}

void CapMF()
{
   char *pq = "MemFiscal.bin";
   char *pqs = "MemFiscal.txt";
   char texto[1024];

   cout << "Aguarde..." << endl;

   ECF_RetornaPath(texto);
   strcat(texto,BARRA);	
   strcat(texto,pq);
   Resposta = ECF_DownloadMF(texto);
   Memo1.Lines.Add(string("ECF_DownloadMF - Resposta: ")+string(inttostr(Resposta)));
   cout << "ECF_DownloadMF - Resposta: " << dec << Resposta << endl;
   if (Resposta == 1)
   {
       ECF_RetornaPath(texto);
       strcat(texto,BARRA);	
       strcat(texto,pq);
       Memo1.Lines.Add(string("Gerado o arquivo binario ")+string(texto));
       cout << "Gerado o arquivo binario: "<< texto << endl;
       ECF_RetornaPath(texto);
       strcat(texto,BARRA);	
       strcat(texto,pqs);
       cout << "Gerado o arquivo texto: "<< texto << endl;
   }
   else
       cout << "Erro na geracao do arquivo !" << endl;	

   Pausa();
}

void Cap52()
{
#ifndef WIN32
   char   *pq = "Vide SWEDA/RFD/S E F A Z - ArqDigital = [CD] & [Transmitir] ";
#else
   char   *pq = "Vide SWEDA\\RFD\\S E F A Z - ArqDigital = [CD] & [Transmitir] ";
#endif
   char   data[12];
   char   texto[1024];

   cout << "Voce pode entrar com o nome do arquivo OU pular para a data a seguir: "<< endl;
   cout << "ECF MFD:  Informar o nome que contem a Memoria Fiscal (opcional)... " << endl;
   cout << "ECF matricial: Informar o arquivo com prefixo RFD que tem o movimento...(opcional) "<< endl; 
   GetTexto("Entre com a localizacao e o nome do arquivo origem (opcional): ",texto,sizeof(texto)-1);

   GetTexto("Entre com a data (dia, mes e ano): ",data,10);

   cout << "Aguarde..." << endl;
   Resposta = ECF_GeraRegistrosCAT52MFD(texto,data);
   Memo1.Lines.Add(string("ECF_GeraRegistrosCAT52MFD - Resposta: ")+string(inttostr(Resposta)));

   if (Resposta == 1)
   {
       Memo1.Lines.Add(string(pq));
       cout << pq << endl;	
       cout << "Gerado em codificacao WINDOWS CODE PAGE" << endl;
   }
   else
       cout << "Erro na geracao do arquivo !" << endl;	

   Pausa();
}

void TabMerc()
{
   char   datai[12], dataf[12];
   char   texto[1024];

   GetTexto("Entre com a data inicial (dia, mes e ano): ",datai,10);
   if (datai[0] == 0)
      return; 	
   GetTexto("Entre com a data final (dia, mes e ano): ",dataf,10);
   if (dataf[0] == 0)
      return; 	

   Resposta = ECF_RetornaPath(texto);
   strcat(texto,BARRA); 
   strcat(texto,"Mercadorias.TXT");

   cout << "Aguarde..." << endl;
   Resposta = ECF_TabelaMercadoriasServicos3404(texto,datai,dataf);
   Memo1.Lines.Add(string("ECF_TabelaMercadoriasServicos3404 - Resposta: ")+string(inttostr(Resposta)));

   if (Resposta == 1)
   {
      Memo1.Lines.Add(string("Gerado arquivo ")+string(texto));
       cout << "Gerado: "<< texto << endl;
   }
   else
      cout << "Erro na geracao do arquivo !" << endl;	

   Pausa();
}

void ReproMem()
{
   char   tipo[2];
   char   *pq = "MFiscal.bin";
   char   *pqt = "MFiscal.txt";
   char   faixai[12], faixaf[12];
   char   texto[1024];
   char   texto1[1024];
   char   texto2[1024];

   cout<<"0=LMF simplif   1=LMF completa    2=LMF/MFD cotepe    3=TDM cotepe  4=TDM cotepe"<< endl;
   GetTexto("Tipo de documento (0 a 4): ",tipo,1);
   if (tipo[0] == 0)
      return; 	

   cout<<"faixa pode ser data ou CRZ" << endl;
   GetTexto("Entre com a faixa inicial : ",faixai,10);
   if (faixai[0] == 0)
      return; 	

   GetTexto("Entre com a faixa final : ",faixaf,10);
   if (faixaf[0] == 0)
      return; 	

   Resposta = ECF_RetornaPath(texto2);
   strcat(texto2,BARRA); 
   strcat(texto2, (tipo[0] >= '2') ?  "Cotepe.TXT" : "Leitura.TXT");

   if ((tipo[0] == '2') && MessageQ("Gera cotepe apenas da MFD (s ou n) ?: ","") == Y)
      texto[0] = '\0';
   else
   {
      Resposta = ECF_DownloadMF(pq);
      Memo1.Lines.Add(string("ECF_DownloadMF - Resposta: ")+string(inttostr(Resposta)));
      ECF_RetornaPath(texto);
      strcat(texto,BARRA);	
      strcat(texto,pq);
      if (Resposta == 1)
      {
          cout << "Gerado: " << texto << endl;
          Memo1.Lines.Add(string("Gerado o arquivo binario: ")+ string(texto));
          ECF_RetornaPath(texto1);
          strcat(texto1,BARRA);	
          strcat(texto1,pqt);
          Memo1.Lines.Add(string("Gerado o arquivo MF completo: ")+ string(texto1));
      }
      else
          cout << "Erro na geracao do arquivo !" << endl;	
   }

   Resposta = ECF_ReproduzirMemoriaFiscalMFD(tipo,faixai, faixaf, texto2, texto);
   Memo1.Lines.Add(string("ECF_ReproduzirMemoriaFiscalMFD - Resposta: ")+string(inttostr(Resposta)));

   if (Resposta == 1)
   {
       Memo1.Lines.Add(string("Gerado o arquivo solicitado: ")+ string(texto2));
       cout << "Gerado: " << texto2 << endl;
       if (tipo[0] >= '2') 
           cout << "assume codificacao WINDOWS CODE PAGE no arquivo cotepe. " << endl;	
   }
   else
       cout << "Erro na geracao do arquivo solicitado !" << endl;	

   Pausa();
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Controle do programa de teste...

void infostatus()
{unsigned int iAck,iSt1,iSt2,iSt3,iGav;
  cout << "Aguarde..."<<endl;
  Resposta = ECF_VerificaEstadoImpressoraMFD(&iAck, &iSt1, &iSt2, &iSt3);
  DecodificaStatus(&iAck, &iSt1, &iSt2 );
  Resposta = ECF_VerificaEstadoGaveta(&iGav);
  if (iSt3 != 0) 
      cout << "Codigo de erro: " << iSt3 << endl;
  cout << "Gaveta: "<< hex << iGav << ((iGav & 1) ? " fechada!" : " aberta!") << endl;
  ECF_MsgLog(BufLog,sizeof(BufLog));  // descarta  mensagens de log geradas pela biblioteca
}


void none(){}

struct dm {char *texto,d,prox;void (*f)();} m[20][32]={

{//menu principal

//{Texto (texto),tecla-comando (d),proximo nivel (nivel),funcao (f)}

{"                     Programa exemplo que usa Connect_C no Linux/Windows",0,0,none},
{"1 - Emissoes...",'1',1,none},
{"2 - Informacoes...",'2',2,none},
{"3 - Capturar..",'3',3,none},
{"4 - Programar...",'4',4,none},
{"q - sair",'q',0,none},
{"",0,0,none}

},
{

//{Texto (texto),tecla-comando (d),proximo nivel (nivel),funcao (f)}

{"                     Programa exemplo que usa Connect_C no Linux/Windows",0,0,none},
{"                                                   Menu de emissoes",0,0,none},
{"1 - Abertura do dia",'1',0,AbertDia},
{"2 - Cupom fiscal",'2',0,CupomFiscal},
{"3 - Cupom fiscal + comprovante TEF",'3',0,Venda1},
{"4 - Cupom fiscal (abre gaveta)",'4',0,vendas2},
{"5 - Cupom fiscal um item multiplas vezes",'5',0,vender},
{"6-  Cupom Adicional",'6',0,SegCupom},
{"7 - Recebimento nao fiscal",'7',0,RecebeNaoFiscal},
{"8 - Recebimento nao fiscal - varios itens",'8',0,RecebeVariosNaoFiscal},
{"9 - Recebimento nao fiscal - varios itens - opcao 2",'9',0,RecebeVariosNaoFiscalOpcao2},
{"a - T  E  F",'a',5,none},
{"b - Cancelar Cupom ou comprovante",'b',0,CancDoc},
{"c - Efetuar suprimento de caixa",'c',0,SuprirCaixa},
{"d - Retirar numerario do caixa",'d',0,RetiradaCaixa},
{"e - Relatorio Gerencial",'e',0,RelatorioGerencial},
{"f - Relatorio Gerencial pronto",'f',0,RelatorioGerencial2},
{"g - Imprimir Cheque...",'g',0,ImprimirCheque},
{"h - Autenticacao",'h',0,Autentica},
{"i - Estorno de meio de pagamento",'i',0,EstorPG},
{"j - Leitura X",'j',0,LeituraX},
{"k - Fechamento do dia",'k',0,FecDia},
{"l - Reducao Z",'l',0,ReducaoZ},
{"m - Leituras da Memoria Fiscal",'m',0,lmf},
{"n - Leitura de Parametros",'n',0,LstParam},
{"v - Mostrar Log de operacoes",'v',0,MostraBuffer},
{"q - Voltar",'q',0,none},
{"",0,0,none}


},
{

//{Texto (texto),tecla-comando (d),proximo nivel (nivel),funcao (f)}
{"                     Programa exemplo que usa Connect_C no Linux/Windows",0,0,none},
{"                                                   Menu Informacoes",0,0,none},
{"1 - Relogio do ECF", '1',0, MostraRelogioECF},
{"2 - Informacoes sobre o ECF (total) ",'2',0,InformacoesECF},
{"3 - ...Programacao", '3',0, InformProg},
{"4 - ...Ultimo  Documento", '4',0, InformUltimoDoc},
{"5 - ...Acumuladores do dia", '5',0, InformAcumDiarios},
{"6 - ...Contadores   do dia", '6',0, InformContadoresDiarios},
{"7 - ...Status", '7',0, InformStatus},
{"8 - ...Diversos", '8',0, InformDiversos},
{"9 - ...Apos a REDUCAO Z", '9',0, InformAposReducaoZ},
{"a - ...SINTEGRA", 'a',0, InformSintegra},
{"b - ...Data do Movimento", 'b',0, InformDataMov},
{"c - Verificar recebimentos nao fiscais",'c',0,VerificaNaoFiscal},
{"d - Registradores fiscais",'d',0,RegistradoresFiscais},
{"e - Ler aliquotas e indices",'e',0,LeAliq},
{"f - Ler codigo CMC7 no cheque",'f',0,LeCMC7},
{"g - Retorna indice de totalizador nao fiscal", 'g',0,RetIndice},
{"h - Retorna valor de um meio de pagamento",'h',0,RetMeio},
{"i - Retorna valor de um Totalizador Nao Fiscal",'i',0,RetNFisc},
{"v - Mostrar Log de operacoes",'v',0,MostraBuffer},
{"q - voltar",'q',0,none},
{"",0,0,none},

},
{

//{Texto (texto),tecla-comando (d),proximo nivel (nivel),funcao (f)}
{"                     Programa exemplo que usa Connect_C no Linux/Windows",0,0,none},
{"                                                   Menu Capturar",0,0,none},
{"1 - texto - Leitura X",'1',0,CapturarLeituraX},
{"2 - texto - Memoria Fiscal faixa CRZ (simplificada)",'2',0,LerMF},
{"3 - texto - Memoria Fiscal faixa CRZ (completa)",'3',0,LerMFc},
{"4 - texto - Memoria Fiscal faixa data (simplificada)",'4',0,LerMF_Data},
{"5 - texto - Memoria Fiscal faixa data (completa)",'5',0,LerMF_Datac},
{"6 - texto - Memoria Fita Detalhe faixa COO",'6',0,LerMFD},
{"7 - texto - Memoria Fita Detalhe faixa data",'7',0,LerMFD_Data},
{"8 - texto - Parametros do ECF",'8',0,LerParametros},
{"9 - texto - Leitua X - segunda opcao",'9',0,CapLeitx},
{"a - texto - Leituras da Memoria Fiscal - segunda opcao",'a',0,Capturalmf},
{"b - binario - Memoria Fita Detalhe - Gera SINTEGRA ",'b',0,LerSintegra},
{"c - binario - Memoria Fita Detalhe - Gera SINTEGRA  - opcao 2:", 'c',0,LerSintegra2},
{"d - binario - Memoria Fiscal - Gera leitura completa", 'd',0,CapMF},
{"e - binario - Memoria Fita Detalhe - Gera Fita detalhe",'e',0,GeraFD},
{"f - C  A  T    5  2  & cotepe", 'f', 0,Cap52},
{"g - binario - Tabela Mercadorias ",'g',0,TabMerc},
{"h - binario - Reproduzir leituras & cotepe",'h',0,ReproMem},
{"i - binario - Software Basico",'i',0,CapSB},
{"v - Mostrar Log de operacoes",'v',0,MostraBuffer},
{"q - voltar",'q',0,none},
{"",0,0,none},

},
{

//{Texto (texto),tecla-comando (d),proximo nivel (nivel),funcao (f)}
{"                     Programa exemplo que usa Connect_C no Linux/Windows",0,0,none},
{"                                                   Menu Diversos",0,0,none},
{"1 - Programar Relogio",'1',0,ProgRel}, 
{"2 - Programar parametros diversos em MIT",'2',0,ProgPar},
{"3 - Programar cabecalho em MIT",'3',0,ProgCab},
{"4 - Programar aliquota",'4',0,ProgramarAliquota},
{"5 - Habilitar/Desabilitar tipos de isentos em MIT",'5',0,ProgIsentos},
{"6 - Programar totalizador nao sujeito ao Icms",'6',0,NomearTotalizador},
{"7 - Programar meio de pagamento",'7',0,MeioPagamento},
{"8 - Programar meios de pagamento",'8',0,Meiospagamento}, 
{"9 - Programar nome do operador", '9',0,NomeOpera},
{"a - Habilitar/Desabilitar Horario de verao",'a',0,ProgVerao},
{"b - Programar titulos de Relatorio Gerencial",'b',0,ProgRG}, 
{"c - Habilitar/Desabilitar a emissao automatica de cupom adicional",'c',0,CFAdicional},
{"d - Habilitar/Desabilitar arredondamento do preco total",'d',0,Arredond},
{"e - Verificar Impressora ligada",'e',0,Lig},
{"f - Habilitar fechamento automatico de cupom",'f',0,ProgFec},
{"g - Configurar Corte, velocidade e outros",'g',0,ConfigECF},
{"h - Ativa/desativa ou ajusta o corte",'h',0,ProgCorte},
{"i - Programar Logotipo de autenticacao",'i',0,ProgLogoAut},
{"j - Programar leiaute de banco para imprimir cheque",'j',0,ProgLeiaute},
{"k - Habilitar/Desabilitar caixas de mensagens (WINDOWS)",'k',0,ProgJan}, 
{"v - Mostrar Log de operacoes",'v',0,MostraBuffer},
{"q - voltar",'q',0,none},
{"",0,0,none},

},
{

//{Texto (texto),tecla-comando (d),proximo nivel (nivel),funcao (f)}
{"                     Programa exemplo que usa Connect_C no Linux/Windows",0,0,none},
{"                                                   Menu TEF",0,0,none},
{"1 - Emitir comprovante TEF", '1',0,EmitTEF}, 
{"2 - Emitir segunda via",'2',0,SegVia},
{"3 - Reimprimir",'3',0,Reimpr},
{"4 - Estorno",'4',0,Estor},
{"5 - Emitir TEF como Relatorio Gerencial",'5',0,RGTEF},
{"v - Mostrar Log de operacoes",'v',0,MostraBuffer},
{"q - voltar",'q',1,none},
{"",0,0,none},

}

};

#ifndef WIN32
class TApp{
pthread_t Handle;
bool terminado;
public:
TApp();
void Run();
void terminar();
~TApp();
};

int menu(TApp *ap)
// inicio da função
//int menu (void *v)

#else

int MENU = 0;
int swDeixaRolar(HWND jan)
{
	MSG msg;

	while (PeekMessage(&msg, jan,0,0, PM_REMOVE))
	{
		if	(msg.message == WM_QUIT)
			return(1);
		if ((jan == 0) || !IsDialogMessage(jan,&msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}	
	return(0);
}
void menu (void *v)
#endif

{
  int nivel=0;
  int d;
  char c=0;
  bool primeiravez = true;

  while(c!='q')
 {

  c=0;
#ifndef WIN32
  if (primeiravez == false)
     cout<<"\x1B[2J"<<endl;
  else
     cout << endl << endl;
#endif

#ifndef WIN32
  cout << "                    \x1B[34;47m SWEDA INFORMATICA LTDA          VERSAO:  1.0 \x1B[0m" << endl << endl;
#else
  cout << "                    SWEDA INFORMATICA LTDA          VERSAO:  1.0 " << endl << endl;
#endif

  for (d=0;strcmp(m[nivel][d].texto,"");d++)
           {
             cout<<m[nivel][d].texto<<endl;
           }

  if (primeiravez == false || Conectado == 1)
     infostatus();

  primeiravez = false;
  do { cin>>c; } while (c <= ' ');

  for (d=0;strcmp(m[nivel][d].texto,"")&&m[nivel][d].d!=c;d++);

  if (m[nivel][d].d!='q'&&m[nivel][d].f!=none) m[nivel][d].f();

  if (m[nivel][d].f==none&&m[nivel][d].d!=0) 
    { if (nivel) c='\0';
       nivel=m[nivel][d].prox;
     }
  }

#ifndef WIN32
 ap->terminar();
#endif

 cout<<"saindo..."<<endl;

#ifndef WIN32
 return 0; 
}

TApp::TApp():terminado(false)
#else
  MENU = 0;	
  _endthread();
  return;
}

void Abrir()
#endif


{
  string  frase; 

#ifndef WIN32
  size_t  achou;

  char *s =  getenv ("LANG");
  cout<<"\x1B[2J"<<endl;

  if (s != NULL)  
  {
      cout << endl << endl << "Linguagem definida na variavel ambiente \" LANG \":   " <<  s << endl <<	endl;
      frase = *s;
      achou = frase.find("UTF-16");
      if (achou == string::npos)
          achou = frase.find("UTF-32");

      if (achou != string::npos)
          cout << "Aviso: Linguagem " << s <<  "nao suportada pela biblioteca porque tem comprimento fixo superior a 8 bits." << endl << endl; 
      else
	  cout << "Aviso: Linguagens com comprimento fixo de 8 bits e UTF-8 sao suportadas pela biblioteca. " << endl << endl;	
  }	
#endif

  cout<<"\n\nDetectando ECF e conectando aplicativo..."<<endl;
  Conectado = ECF_AbrePortaSerial ();
//  Conectado = ECF_AbreConnectC (0, "/sweda");

  Memo1.Lines.Add(string(" "));         // log inicio de carga da biblioteca

#ifndef WIN32
  pthread_create (&Handle, NULL, (void* (*) (void*)) &menu, this);
#else

  MENU = 1;
  _beginthread(menu,0,NULL);
  while (MENU == 1)
  {
	  Sleep(100); 
	  swDeixaRolar(NULL);
  }
#endif
}

#ifndef WIN32
void TApp::Run()
{
  while (!terminado) usleep(10*1000);
}
void TApp::terminar()
{ terminado=true;
}
TApp::~TApp()
#else

void fechar()
#endif

{ ECF_FechaPortaSerial();
}


int main()
{ 
#ifndef WIN32
TApp *app=new TApp;
app->Run();
delete app;
#else
  Abrir();
  fechar();
#endif
 return 0;
}

